第三章以C++Builder设计 Modbus通信程序.pdf
《第三章以C++Builder设计 Modbus通信程序.pdf》由会员分享,可在线阅读,更多相关《第三章以C++Builder设计 Modbus通信程序.pdf(51页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第三章:以第三章:以 C+Builder 设计设计 Modbus 通信程序通信程序 本章提供于 Windows 操作系统设计 Modbus 通信程序所需的基本子程序,以 Borland C+Builder V5.0 所设计的 Sample Porgram 提供读者参考。所有原始档(source program)都存于随书赠送的光盘片内。读者必须了解通信程序是需要高度与操作系统的 API 相配合,各种资料型态的转换,Multi-Thread 的运用,时间的掌控等事项,以 C 语言为最适合的语言。1 基本子程序作成基本子程序作成 DLL 因为设计 Modbus 通信程序时,需要 RS232C 联机
2、、资料型式的转换、LRC、CRC 计算等功能。此方面以 C 语言设计才能达到所要的需求,故必须将这些基本功能设计成 DLL 的方式,让其它以 C+或 VB 设计的主程序更方便使用。以下列出各种子程序的说明及用法。以下子程序将设计成 MB_SUB.DLL,使用时必须存入 Windows 的系统目录内。1.1 RS232C 基本子程序基本子程序 Subroutine Name:BOOL seropen(int nPort,int nBaud,char parity,int data_bit,int stop_bit,int flow)Source Name:RS232_SUB.c Library
3、Name:MB_SUB.LIB、MB_SUB.DLL、MB_SUB.h 设计语言:C+Builder V5.0 子程序说明:Open COM port。Parameter 说明:int nPort:所要 open 的 port no.(例如:COM1 为 port=1)。int Baud:通信 baud rate(由 1200、2400、115200 等)。char parity:位检查(N:None、O:Odd、E:Even)。int data_bit:每个位 bits 数(7 or 8)。int stop_bit:每个位 stop bits(1 or 2)。int flow:设定 flow
4、 control(0:不要、1:要)。Return Code:true:设定正常。false:设定异常。处理说明:1:依据所设定的通信系数,open COM port。2:使用 CreateFile()、GetCommState()、SetCommState()、GetCommTimeouts()、SetCommTimeouts()等 RS232C 通信相关的Windows System API。使用例子:int port,baud,parity,data_bit,stop_bit,flow;BOOL rc;port=1;/COM1 port baud=19200;parity=N;data_
5、bit=8;stop_bit=1;flow=0;rc=seropen(port,baud,parity,data_bit,stop_bit,flow);Subroutine Name:BOOL serclose(int nPort)Source Name:RS232_SUB.c Library Name:MB_SUB.LIB、MB_SUB.DLL、MB_SUB.h 设计语言:C+Builder V5.0 子程序说明:Open COM port。Parameter 说明:int nPort:所要 close 的 port no.(例如:COM1 为 port=1)。Return Code:Tru
6、e:设定正常。false:设定异常。处理说明:1:close COM port。2:使用 CloseHandle()的 Windows System API。使用例子:int port,baud,parity,data_bit,stop_bit,flow;BOOL rc;port=1;/COM1 port rc=serclose(port);Subroutine Name:int serwrite(int nPort,char*data,int len)Source Name:RS232_SUB.c Library Name:MB_SUB.LIB、MB_SUB.DLL、MB_SUB.h 设计语
7、言:C+Builder V5.0 子程序说明:由 COM port 输出 n bytes data。parameter 说明:int nPort:所要输出的 port no.(例如:COM1 为 port=1)。char*data:所要输出的 data buffer area。int len:所要输出 data 的 byte 数。Return Code:所输出成功的 data byte 数。处理说明:1:依据所设定的 data,由指定 COM port 输出。2:使用 WriteFile()的 Windows System API。使用例子:int port,len,rc;char buff8
8、0;port=1;/COM1 port len=10;strcpy(buff,“ABCDEFGHIJ”);rc=serwrite(port,buff,len);Subroutine Name:BOOL sersend(int nPort,char Byte)Source Name:RS232_SUB.c Library Name:MB_SUB.LIB、MB_SUB.DLL、MB_SUB.h 设计语言:C+Builder V5.0 子程序说明:由 COM port 输出一个 byte data。parameter 说明:int nPort:所要输出的 port no.(例如:COM1 为 por
9、t=1)。char Byte:所要输出的 byte data。Return Code:True:输出正常。false:输出异常。处理说明:1:依据所设定的 byte,由指定 COM port 输出。2:使用 WriteFile()的 Windows System API。使用例子:int port;BOOL rc;char data;port=1;/COM1 port data=A;rc=sersend(port,data);Subroutine Name:short serrecv(int nPort)Source Name:RS232_SUB.c Library Name:MB_SUB.L
10、IB、MB_SUB.DLL、MB_SUB.h 设计语言:C+Builder V5.0 子程序说明:由 COM port 接收一个 byte data。parameter 说明:int nPort:所要接收的 port no.(例如:COM1 为 port=1)。Return Code:不为 1 时,表示接到 byte data 的值。-1:表示未接到任何 byte data 处理说明:1:依据所设定的 data,由指定 COM port 输出。2:使用 ReadFile()的 Windows System API。使用例子:int port;short ch;port=1;/COM1 port
11、 ch=serrecv(port);Subroutine Name:int serread(int nPort,void*buffer,int limit)Source Name:RS232_SUB.c Library Name:MB_SUB.LIB、MB_SUB.DLL、MB_SUB.h 设计语言:C+Builder V5.0 子程序说明:由 COM port 接收 n bytes data。Parameter 说明:int nPort:读取由 COM port 所接到的 data(例如:COM1 为port=1)。void buffer:接到 data 所存入的 buffer area。i
12、nt limit:最大读取数 Return Code:0:表示未接到任何 byte data。0:表示实际接到 byte data 数目。处理说明:1:依据所设定的 data,由指定 COM port 输出。2:使用 ReadFile()的 Windows System API。使用例子:int port,limit,rc;char buff80;port=1;/COM1 port limit=80;rc=serread(port,buff,limit);Subroutine Name:void serflush(int nPort)Source Name:RS232_SUB.c Librar
13、y Name:MB_SUB.LIB、MB_SUB.DLL、MB_SUB.h 设计语言:C+Builder V5.0 子程序说明:清空系统内 COM port 的 buffer area。parameter 说明:int nPort:所要清空的 port no.(例如:COM1 为 port=1)。Return Code:无 处理说明:1:使用 PurgeComm()的 Windows System API。使用例子:int port;port=1;/COM1 port ch=serrecv(port);Subroutine Name:int serloc(int nPort)Source Na
14、me:RS232_SUB.c Library Name:MB_SUB.LIB、MB_SUB.DLL、MB_SUB.h 设计语言:C+Builder V5.0 子程序说明:检查 COM port 输入 buffer 内,尚有几个 byte data 未被程序读取。Parameter 说明:int nPort:所要检查的 port no.(例如:COM1 为 port=1)。Return Code:输入 buffer 内 byte data 数。处理说明:1:使用 ClearCommError()的 Windows System API。使用例子:int port;int len;port=1;/
15、COM1 port len=serloc(port);1.2 LRC 及及 CRC Check 子程序子程序 Subroutine Name:void LRC_check(buff,len,chk)Source Name:Error_Check.c Library Name:MB_SUB.LIB、MB_SUB.DLL、MB_SUB.h 设计语言:C+Builder V5.0 子程序说明:计算 LRC ckeck code(2 ASCII code)。Parameter 说明:unsigned char*buff:所要计算的资料。int len:所要计算的资料长度 unsigned char*c
16、hk:计算结果存入位置。Return Code:无。处理说明:1:计算原理,详如第二章 2.3 节。使用例子:unsigned char buff80,chk2;int len;/由前面程序整理出 buff 内资料及长度 LRC_check(buff,len,chk);Subroutine Name:void CRC_check(buff,len,chk)Source Name:Error_Check.c Library Name:MB_SUB.LIB、MB_SUB.DLL、MB_SUB.h 设计语言:C+Builder V5.0 子程序说明:计算 CRC ckeck code(2 bytes
17、(8 bits)code)。Parameter 说明:unsigned char*buff:所要计算的资料。int len:所要计算的资料长度 unsigned char*chk:计算结果存入位置。Return Code:无。处理说明:1:计算原理,详如第二章 2.3 节。使用例子:unsigned char buff80,chk2;int len;/由前面程序整理出 buff 内资料及长度 CRC_check(buff,len,chk);Subroutine Name:void CRC_calc(c,crc)Source Name:Error_Check.c Library Name:MB_
18、SUB.LIB、MB_SUB.DLL、MB_SUB.h 设计语言:C+Builder V5.0 子程序说明:计算 CRC 一个 byte,与 CRC_check 配合使用。Parameter 说明:unsigned char c:所要计算的资料。unsigned short*crc:CRC 计算暂存值。Return Code:无。处理说明:1:计算原理,详如第二章 2.3 节。使用例子:1.3 时间及资料转换子程序时间及资料转换子程序 Subroutine Name:int tsleep(interval)Source Name:winsys.c Library Name:MB_SUB.LIB
19、、MB_SUB.DLL、MB_SUB.h 设计语言:C+Builder V5.0 子程序说明:程序暂停。para.说明:long interval:暂停时间,单位 millsecond.。Return Code:-1:异常 0:正常 处理说明:1:以 Windows System API Sleep()设定暂停时间。2:程序会暂停等待该 interval 后 return。使用例子:long interval;interval=20000;/暂停 20 秒。tsleep(interval);Subroutine Name:int get_date_time(year,month,day,hou
20、r,minute,second,msec,week)Source Name:winsys.c Library Name:MB_SUB.LIB、MB_SUB.DLL、MB_SUB.h 设计语言:C+Builder V5.0 子程序说明:取入系统日期时间。para.说明:short*year:公元年(4 位数)。short*month:月。short*day:日。short*hour:时。short*minute:分。short*second:秒。short*msec:milliseconds。short*week:星期。Return Code:-1:异常 0:正常 处理说明:1:以 Window
21、s System API GetLocalTime()取入日期时间。使用例子:short year,month,day,hour,minute,second,msec,week;get_date_time(&year,&month,&day,&hour,&minute,&second,&msec,&week);Subroutine Name:int set_date_time(year,month,day,hour,minute,second)Source Name:winsys.c Library Name:MB_SUB.LIB、MB_SUB.DLL、MB_SUB.h 设计语言:C+Buil
22、der V5.0 子程序说明:设定系统日期时间。para.说明:short year:公元年(4 位数)。short month:月。short day:日。short hour:时。short minute:分。short second:秒。Return Code:-1:异常 0:正常 处理说明:1:以 Windows System API SetLocalTime()设定日期时间。使用例子:short year,month,day,hour,minute,second;year=1997;month=12;day=30;hour=8;minute=59;second=0;set_date_
23、time(year,month,day,hour,minute,second);Subroutine Name:itascxr(data,n,buf)Source Name:Error_check.c Library Name:MB_SUB.LIB、MB_SUB.DLL、MB_SUB.h 设计语言:C+Builder V5.0 子程序说明:将 16 bits 整数转换成靠右的十六进制(Hex.)ASCII code 字符串。Parameter 说明:unsigned short data:所要转换整数。short n:所要转换后 HEX 位数。char buf:转换后 HEX 存放 Buffe
24、r。Return Code:0:设定正常。-1:所转换位数超过 n 值。处理说明:1:依 16 bits 整数型式转换数值成 HEX 字符串。2:将转换结果填入 buf 内。3:如果位数超过则填入*。4:如果 N data HEX 长度则超过部份,分成两种情形处理,当 N 为正数以空白存入,当 N 为负数以 ASCII Code 0存入。详见使用例子说明。使用例子:unsigned short data;short n;char buff10;data=1234;n=4;itascxr(data,n,buff);/转换后 buff 存入字符串为 4D2,其中 buff0是存入空白ASCII C
25、ode data=1234;n=-4;itascxr(data,n,buff);/转换后 buff 存入字符串为 04D2,其中 buff0是存入 0ASCII Code Subroutine Name:ascxti(buf,n,data)Source Name:Error_Check.c Library Name:MB_SUB.LIB、MB_SUB.DLL、MB_SUB.h 设计语言:C+Builder V5.0 子程序说明:将十六进制 ASCII Code 字符串转换成 16 bits 整数。para.说明:char buf:要转换的 HEX 字符串。short n:要转换的 HEX 字符
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三章以C+Builder设计 Modbus通信程序 第三 Builder 设计 Modbus 通信 程序
限制150内