为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

通信协议串口动态链接库

2018-06-29 31页 doc 67KB 74阅读

用户头像

is_079973

暂无简介

举报
通信协议串口动态链接库通信协议串口动态链接库 一、最新欧姆龙PLC全系列Host Link通信协议串口动态链接库DLL(以下简称DLL),是为满足工业 通信需要,针对工业领域要求上位机对PLC实时采集与控制的组态编程而设计。本DLL是采用 Delphi语言开发的标准串口通讯库,具有以下特点: 1)、实时性、可靠性好,可根据通信数据量自行调整通信时间; 2)、适用于多PLC联网和上位机通信,满足多方面的需要; 3)、函数接口功能全,操作简单; 4)、附加实用转换与读取函数,易于快速开发(VC等非RAD开发环境的开发); 5)、支持US...
通信协议串口动态链接库
通信协议串口动态链接库 一、最新欧姆龙PLC全系列Host Link通信协议串口动态链接库DLL(以下简称DLL),是为满足工业 通信需要,针对工业领域要求上位机对PLC实时采集与控制的组态编程而设计。本DLL是采用 Delphi语言开发的串口通讯库,具有以下特点: 1)、实时性、可靠性好,可根据通信数据量自行调整通信时间; 2)、适用于多PLC联网和上位机通信,满足多方面的需要; 3)、数接口功能全,操作简单; 4)、附加实用转换与读取函数,易于快速开发(VC等非RAD开发环境的开发); 5)、支持USB、PC扩展卡等扩展串口号; 6)、支持多种操作系统win9x/win2000/winXP; 7)、可在多种编程环境下使用,例如VB、VC、Delphi等开发环境。 二、DLL函数说明 1、打开串口 Function ComOpen (nport,BaudRate,DataBits,Parity,StopBits:longint;User:Pchar):longint;stdcall; 参数:nport: 打开串口号,取值为1,8,代COM1,COM8; BaudRate:波特率,取值为1200、2400、4800、9600、19200、38400 (推荐使用9600或 19200); DataBits:数据位,取值为5、6、7、8(推荐使用7或8); Parity: 校验位,取值为1(E)、2(O)、3(M)、4(S)、5(N),注括号里是校验位的英文缩 写; StopBits:停止位,取值为1(1)、2(2)、3(1.5),注括号里是实际的停止位位数 User:DLL授权用户名; 返回值:长整型,操作成功返回1,否则返回0;打开串口不成功即返回0时的原因:1)、串口不存 在或被占用; 2)、DLL试用过期; 3)、DLL授权注册不正确。 使用举例: ComOpen(1,9600,7,1,1,'wjun') , 打开COM1口,并设定波特率,9600、数据位,7、校验位,E(偶 校验)、停止位,1,授权用户='wjun'。 2、关闭串口 Function ComClose(nport:longint):longint;stdcall; 参数:nport: 串口号,取值为1,8,代表COM1,COM8; 返回值:长整型,操作成功返回1,否则返回0; 使用举例: ComClose(1) ,关闭打开的COM1口。 3、读取PLC的操作状态,,,,{这很重要因为Host Link只有在监视或编程状态才可以进行写操 作与强制操作,工控应用中应使用监视状态} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Function ComMS(nport,node:Longint):Longint;stdcall; 参数: nport: 串口号,取值为1,8,代表COM1,COM8; node: PLC站号或节点号(单元号),取值为0,31; 返回值:长整型,返回值:0:编程、1:运行、2:监视、3:读取错误; 使用举例: ComMS(1,0),由串口1读取0号PLC的操作状态; 4、改变PLC的操作状态 Function ComSC(nport,node,State:longint):Longint;stdcall; 参数: nport: 串口号,取值为1,8,代表COM1,COM8; node: PLC站号或节点号(单元号),取值为0,31; State:PLC状态参数,取值为0:编程、1:运行、2:监视; 返回值:长整型,操作成功返回1,否则返回0; 5、读取PLC的型号代码 Function ComMM(nport,node:Longint):Pchar;stdcall; 参数: nport: 串口号,取值为1,8,代表COM1,COM8; node: PLC站号或节点号(单元号),取值为0,31; 返回值:Pchar(字符串),返回值:"Error":表示读取错误 其他见下表: 型号代码 PLC型号 "01" C250 "02" C500 "03" C120 "0E" C2000 "10" C1000H "11" C2000H/CQM1/CPM2A/CPM2C/CPM1/CPM1A/SRM1(-V2) "12" C20H/C28H/C40H/C200H/C200HS "20" CV500 "21" CV1000 "22" CV2000 "30" CP1H "40" CVM1-CPU01-E "41" CVM1-CPU11-E "42" CVM1-CPU21-E 所有字符串返回值都以"@"为字符串数据终止符,有效字符串为"@"之前的所有字符串组; 6、测试PC与PLC的通信是否可以有效执行 Function ComTS(nport,node:longint):Longint;stdcall 参数: nport: 串口号,取值为1,8,代表COM1,COM8; node: PLC站号或节点号(单元号),取值为0,31; ,否则返回0; 返回值:长整型,测试成功返回1 7、PLC存储器数据的读取(IR/SR、LR、HR、AR、DM、T-PV值、T-状态值) Function ComWR(nport,node,address,Count:longint;Order:pchar):Pchar;stdcall; 参数: nport: 串口号,取值为1,8,代表COM1,COM8; node: PLC站号或节点号(单元号),取值为0,31; address: 寄存器地址,取值请参欧姆龙PLC手册; Count: 读取寄存器个数,T-状态值的读取最大可读一次都120个,其它一次可读30个字的数据; Order:读取各区命令字符见下表: 命令代码 读取区域 "RR" IR/SR "RL" LR "RH" HR "RJ" AR "RD" DM "RC" T-PV值 "RG" T-状态值 返回值:字符串数据,字符串数据的终止符为"@"; 使用举例: ComWR(1,0,0,4,'RR') ,由COM1读取0000,0003四个寄存器的值,如返回值为 “0001006403E809F0@”,则表示0000=0001, 0001=0064,0002=03E8,0003=09F0; 1)、非T区的读取返回值为16进制字符串组,可以将返回值如上四位一组再转换成“0000,FFFF” 的整数值; ,,,,,,,,,, ,,,, ,,, 读字符串序列如: | 0001 | 0064 | 03E8 | 009F | | @ | ,,,,,,,,,, ,,,, ,,, IR区 0000 0001 0002 0003 终止符 对T/C区: 2)、如读T-PV值,例ComWR(1,0,0,4,'RC') 则返回BCD码组合数据,表示T的PV值(当前值) ,,,,,,,,,, ,,,, ,,, 读字符串序列如: | 0001 | 01000 | 1000 | 0159 | | @ | ,,,,,,,,,, ,,,, ,,, T区 0000 0001 0002 0003 终止符 3)、如读取T/C-状态值,例ComWR(1,0,0,4,'RG') 则返回0、1字符串组,表示T/C的完成状态 ,,,,,,,,,,,,, ,,, 读字符串序列如: | 1 | 0 | 0 | 1 | | @ | ,,,,,,,,,,,,, ,,, T区 0000 0001 0002 0003 终止符 8、PLC存储器数据的写入(IR/SR、LR、HR、AR、DM) Function ComWW(nport,node,address:longint;Sendstr,Order:pchar):Longint;stdcall; 参数: nport: 串口号,取值为1,8,代表COM1,COM8; node: PLC站号或节点号(单元号),取值为0,31; address: 寄存器地址,取值请参欧姆龙PLC手册; Sendstr:给PLC写入的字符串数据组;IR/SR区一次最多写30个字、LR区、HR区、AR区注意不要超出 地址范围、 DM值区一次最多写29个字。 Order:写入各区命令字符见下表: 命令代码 写入区域 "WR" IR/SR "WL" LR "WH" HR "WJ" AR "WD" DM 返回值:长整型,操作成功返回1,否则返回0; 使用举例:ComWW(1,0,0,'0001006403E8009F','WR'),由串口1预置值0号PLC的IR区 的0000=1, 0001=100,0002=1000,0003=159。 写入值为16进制字符串组 写字符串序列如: | 0001 | 0064 | 03E8 | 009F | ,,,,,,,,,, ,,,, IR区 0000 0001 0002 0003 9、PLC的线圈强制置位(IR、LR、HR、AR、TIM、TIMH、TIML、TMHH、CNT、CNTR) Function ComFBitset(nport,node,address,Bit:longint;Order:pchar):Longint;stdcall; 参数: nport: 串口号,取值为1,8,代表COM1,COM8; node: PLC站号或节点号(单元号),取值为0,31; address: 寄存器地址,取值请参欧姆龙PLC手册, Bit: 强制置位字地址的位地址,取值0,15,TIM、TIMH、TIML、TMHH、CNT、CNTR 强制置位时的 取值总是0。 Order:强制置位各区命令字符见下表: 命令代码 强制置位区域 "CIO" IR/SR "LR" LR "HR" HR "AR" AR "TIM" 定时器完成标志 "TIMH" 高速定时器完成标志 "TIML" 长定时器完成标志 "TMHH" 特高速定时器完成标志 "CNT" 计数器完成标志 "CNTR" 可逆定时器完成标志 返回值:长整型,操作成功返回1,否则返回0; 使用举例: ComFBitset(1,0,0,0,'CIO'),强制置位(IR)0.00; ComFBitset(1,0,0,0,'TIM'),强制置位(T)0000。 10、PLC的线圈强制复位(IR、LR、HR、AR、TIM、TIMH、TIML、TMHH、CNT、CNTR) Function ComFBitreset(nport,node,address,Bit:longint;Order:pchar):Longint;stdcall; 参数: nport: 串口号,取值为1,8,代表COM1,COM8; ,31; node: PLC站号或节点号(单元号),取值为0 address: 寄存器地址,取值请参欧姆龙PLC手册; Bit: 强制复位字地址的位地址,取值0,15;TIM、TIMH、TIML、TMHH、CNT、CNTR 强制复位时的 取值总是0。 Order:强制复位各区命令字符见下表: 命令代码 强制复位区域 "CIO" IR/SR "LR" LR "HR" HR "AR" AR "TIM" 定时器完成标志 "TIMH" 高速定时器完成标志 "TIML" 长定时器完成标志 "TMHH" 特高速定时器完成标志 "CNT" 计数器完成标志 "CNTR" 可逆定时器完成标志 返回值:长整型,操作成功返回1,否则返回0; 使用举例: ComFBitreset(1,0,0,0,'CIO'),强制复位(IR)0.00; ComFBitreset(1,0,0,0,'TIM'),强制复位(T)0000。 11、PLC的多线圈强制置位复位(IR、LR、HR、AR、TIM、TIMH、TIML、TMHH、CNT、CNTR) Function ComFRSset(nport,node,address:longint;Sendstr,Order:pchar):Longint;stdcall; 参数: nport: 串口号,取值为1,8, 代表COM1,COM8; node: PLC站号或节点号(单元号),取值为0,31; address: 寄存器地址,取值请参欧姆龙PLC手册; sendstr: 给多线圈写入的值,该值为16进制字符串组成的16个字符串依下表次排列,TIM、TIMH 、TIML、TMHH、CNT、CNTR强制置位复位时仅第15位是有效的其它将被忽略。 ,,,,,,,,,, , ,,,,,,,,,, , ,,,,,,, ,, 字符串序列: | 0 | 2 | 3 | 5 | 4 | 8| 2 | 5 | 3 | 0 | 2 | 8 | 0 | 2 | 3 | 5 | ,,,,,,,,,, , ,,,,,,,,,, , ,,,,,,, ,, bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 16进制字符串所表示的处理意义参下表: 0:不改变位状态 2:复位 3:置位 4:强制复位 5:强制置位 8:取消强制置位/复位 Order:强制置位复位各区命令字符见下表: 命令代码 复位区域 "CIO" IR/SR "LR" LR "HR" HR "AR" AR 返回值:长整型,操作成功返回1,否则返回0; 使用举例: ComFRSset(1,0,0,'0235482530280235','CIO'),DLL将给(IR)0000按下表动作: 0.15 0 不改变位状态 0.14 2 复位 0.13 3 置位 0.12 5 强制置位 0.11 4 强制复位 0.10 8 取消强制置位/复位 0.09 2 复位 0.08 5 强制置位 0.07 3 置位 0.06 0 不改变位状态 0.05 2 复位 0.04 8 取消强制置位/复位 0.03 0 不改变位状态 0.02 2 复位 0.01 3 置位 0.00 5 强制置位 12、取消所有被强制置位、复位、及多位强制置复位的强制状态 Function ComFCancel(nport,node:longint):Longint;stdcall; 参数: nport: 串口号,取值为1,8, 代表COM1,COM8; node: PLC站号或节点号(单元号),取值为0,31; 返回值:长整型,操作成功返回1,否则返回0; 使用举例: ComFCancel(1,0),取消PLC中所有被强制置位、复位的单元 注:使用强制命令后PLC程序、写入命令都无法改变被强制的位的状态值,因此在实际工控应用中 建议用写入命令或多线圈强制置位复位命令ComFRSset中的字符串处理码的2:复位、3:置位来操作 置位复位。如果一定要用强制命令,那么在记得使用后用取消强制命令来恢复管理。 由此可以推出下面的置位与复位函数,注意采用置位与复位函数,置位或复位的结果将受PLC程序 输出的影响,推崇置/复位用在输入条件中。 13、PLC的线圈置位(IR、LR、HR、AR、TIM、TIMH、TIML、TMHH、CNT、CNTR) Function ComSet(nport,node,address,Bit:longint;Order:pchar):Longint;stdcall; 参数: nport: 串口号,取值为1,8,代表COM1,COM8; node: PLC站号或节点号(单元号),取值为0,31; address: 寄存器地址,取值请参欧姆龙PLC手册, Bit: 置位字地址的位地址,取值0,15,TIM、TIMH、TIML、TMHH、CNT、CNTR置位时的取值总是0 。 Order:置位各区命令字符见下表: 命令代码 置位区域 "CIO" IR/SR "LR" LR "HR" HR "AR" AR "TIM" 定时器完成标志 "TIMH" 高速定时器完成标志 "TIML" 长定时器完成标志 "TMHH" 特高速定时器完成标志 "CNT" 计数器完成标志 "CNTR" 可逆定时器完成标志 返回值:长整型,操作成功返回1,否则返回0; 使用举例: ComSet(1,0,0,0,'CIO'),置位(IR)0.00; ComSet(1,0,0,0,'TIM'),置位(T)0000。 14、PLC的线圈复位(IR、LR、HR、AR、TIM、TIMH、TIML、TMHH、CNT、CNTR) Function ComReset(nport,node,address,Bit:longint;Order:pchar):Longint;stdcall; 参数: nport: 串口号,取值为1,8,代表COM1,COM8; node: PLC站号或节点号(单元号),取值为0,31; address: 寄存器地址,取值请参欧姆龙PLC手册; Bit: 复位字地址的位地址,取值0,15;TIM、TIMH、TIML、TMHH、CNT、CNTR复位时的取值总是0 。 Order:复位各区命令字符见下表: 命令代码 复位区域 "CIO" IR/SR "LR" LR "HR" HR "AR" AR "TIM" 定时器完成标志 "TIMH" 高速定时器完成标志 "TIML" 长定时器完成标志 "TMHH" 特高速定时器完成标志 "CNT" 计数器完成标志 "CNTR" 可逆定时器完成标志 返回值:长整型,操作成功返回1,否则返回0; 使用举例: ComReset(1,0,0,0,'CIO'),复位(IR)0.00; ComReset(1,0,0,0,'TIM'),复位(T)0000。 在本DLL中去除了一些特权操作指令接一些不太容易在现场应用中使用的指令(如果有 朋友 认为指令怎么不全而你正好需要的话请注册时与我提出我会将你需要的指令加入。) 三、DLL附加函数说明 1、串口打开状态的读取 Function ComTrue(nport:longint):longint;stdcall; 参数: noprt: 串口号,取值为1,8,代表COM1,COM8; 返回值:长整型,串口打开返回1,否则返回0; 2、整数转换成16进制字符串 (为VC等非RAD开发环境所增设) Function CIntToHex(Cint,Digits:Longint):Pchar;stdcall; 参数: Cint: 待转换整数,取值为(0,65535); Digits: 转换的字符串位数,指定位数小于实际位数时按实际输出; 使用举例: CIntToHex(200,2),则返回字符串“C8@”; CIntToHex(200,4),则返回字符串“00C8@”; CIntToHex(4500,4),则返回字符串“1194@”; CIntToHex(4500,3),则返回字符串“1194@”,因为“194”不足以表示4500这个数所以按实际输 出字符串“1194@”; "@"为字符串数据的终止符。 3、16进制字符串转换成整数 (为VC等非RAD开发环境所增设) Function CHexToInt(CHex:Pchar):Longint;stdcall; 参数: CHex: 待转换字符串,取值为(0000,FFFF); 使用举例: CHexToInt(„03E8?),则返回整数1000; 4、抽取16进制字符串中某个位的值 Function CinBin(CHex:Pchar;Start:longint):longint;stdcall; 参数: CHex: 待转换字符串,取值为(0000,FFFF); Start: 抽取的位,取值为(0,15); 使用举例: CinBin(„0F?,3),则返回值1; CinBin(„0F?,4),则返回值0; CinBin(„03E8?,6),则返回值1; 读取M8,M15组合成的字节值为“FC”时,要读取M10的值时,则调用CinBin(„FC?,3) 返回值1表 示M10的值为1。 5、返回字符串Text左边的Count个字符 (为VC等非RAD开发环境所增设) Function CLeftStr(Text:Pchar;Count:longint):Pchar;stdcall; 参数: Text: 字符串原型; Count: 指定返回左侧字符串个数; 使用举例: CleftStr('123456', 3) = '123@'; "@"为字符串数据的终止符。 6、返回字符串Text右边的Count个字符 (为VC等非RAD开发环境所增设) Function CRightStr(Text:Pchar;Count:longint):Pchar;stdcall; 参数: Text: 字符串原型; Count: 指定返回右侧字符串个数 使用举例: CRightStr('123456', 3) = '456@'; "@"为字符串数据的终止符。 7、返回字符串Text从Start开始的Count个字符 (为VC等非RAD开发环境所增设) Function CMidStr(Text:Pchar;Start,Count:longint):Pchar;stdcall; 参数: Text: 字符串原型; Start: 指定返回字符串的起始位置; Count: 指定返回字符串个数; 使用举例: CMidStr('123456',2,3) = '234@'; "@"为字符串数据的终止符。 8、字符串Substr开始于字符串S的位置 (为VC等非RAD开发环境所增设) Function CinStr(S,Substr:Pchar):Longint;stdcall; 参数: S: 字符串原型; Substr: 查询的字符串; 返回值:长整型; 使用举例: CinStr('1Tfdg23456','2') = 6 DLL中关于传出字符串值的函数都以"@"为字符串函数值终止符。 四、Delphi、VB、VC语言环境的开发使用说明 1、Delphi语言环境开发说明 在Delphi环境下将omron.dll、omron.slip(许可文件)复制到应用程序目录下(即将上述文件与编 译后的可执行文件方入同一文件夹内); 在工程文件的主程序窗体(pas)文件中声明: Function ComOpen (nport,BaudRate,DataBits,Parity,StopBits:longint;User:Pchar):longint;stdcall;External 'omron.dll'; Function ComClose(nport:longint):longint;stdcall;External'omron.dll'; Function ComWR(nport,node,address,Count:longint;Order:pchar):Pchar;stdcall; External'omron.dll'; Function ComWW (nport,node,address:longint;Sendstr,Order:pchar):Longint;stdcall;External'omron.dll'; Function ComMM(nport,node:Longint):Pchar;stdcall;External'omron.dll'; Function ComMS(nport,node:Longint):Longint;stdcall;External'omron.dll'; Function ComSC(nport,node,State:longint):Longint;stdcall;External'omron.dll'; Function ComTS(nport,node:longint):Longint;stdcall;External'omron.dll'; Function ComFBitset (nport,node,address,Bit:longint;Order:pchar):Longint;stdcall;External'omron.dll'; Function ComFBitreset (nport,node,address,Bit:longint;Order:pchar):Longint;stdcall;External'omron.dll'; Function ComFRSset (nport,node,address:longint;Sendstr,Order:pchar):Longint;stdcall;External'omron.dll'; Function ComFCancel(nport,node:longint):Longint;stdcall;External'omron.dll'; Function ComSet (nport,node,address,Bit:longint;Order:pchar):Longint;stdcall;External'omron.dll'; Function ComReset (nport,node,address,Bit:longint;Order:pchar):Longint;stdcall;External'omron.dll'; Function ComTrue(nport:longint):longint;stdcall;External'omron.dll'; Function CinBin(CHex:Pchar;Start:longint):longint;stdcall; External'omron.dll'; 其它附加函数Delphi有实用函数,建议用Delphi自带函数,如需使用声明参上例; 声明后可以在程序中使用这些函数,附加函数置中除ComTrue、CinBin外Delphi系统自 带有类似功 能函数。通信时必须先使用ComOpen函数打开串口,在串口打开后可以有效操作相关函 数,为确保 通信可在程序运行开始时打开串口,程序关闭前关闭串口。应用程序关闭之前请务必将 关闭所有 串口,如串口未关闭前关闭系统将抛出异常。确保应用程序在关闭释放前关闭打开的串口。解决 方法,在form的OnDestroy事件中加入如下语句: if ComTrue(1)=1 then ComClose(1); 在Delphi中给中给DLL中的函数传pchar值问题,参考下例: procedure TForm_omron.ButtonDsendClick(Sender: TObject); Var i,k,l:longint; sendText,Order:pchar; sendstr,Orderstr:string; begin i:=strtoint(Rightstr(Comboxcom.Text,1)); if (SendEdit.Enabled) and (comTrue(i)=1) then begin k:=strtoint(DaddressW.Text); case ComDwrite.ItemIndex of 0: Orderstr:='WR'; 1: Orderstr:='WL'; 2: Orderstr:='WH'; 3: Orderstr:='WJ'; 4: Orderstr:='WD'; end; l:=length(SendEdit.Text) div 4; l:=l*4; sendstr:=leftstr(SendEdit.Text,l); //以字为单位多余省略,4个字符串为一个字 try sendText:=strAlloc(200); sendText:=strPCopy(sendText,sendstr); Order:=strAlloc(4); Order:=strPCopy(Order,Orderstr); if ComWW(i,0,k,SendText,Order)=1 then SendEdit.Enabled:=False; //写各区值 finally StrDispose(sendText); StrDispose(Order); end; end; end; 建议采用strPCopy():string型转换到Pchar型,straps():Pchar型转换到string型,不推荐使用直 接转换法。 上述可以详细参照DEMO程序。 2、VB语言环境开发说明 在VB环境下将omron.dll、omron.slip(许可文件)复制到应用程序目录下(即将上述文 件与编译 后的可执行文件方入同一文件夹内); 在工程文件中声明: Private Declare Function ComOpen Lib "omron.dll" (ByVal nport As Long, ByVal BaudRate As Long,ByVal DataBits As Long,ByVal Parity As Long,ByVal StopBits As Long,ByVal User As String) As Long Private Declare Function ComClose Lib "omron.dll" (ByVal nport As Long) As Long Private Declare Function ComWR Lib "omron.dll" (ByVal nport As Long, ByVal node As Long,ByVal address As Long, ByVal Count As Long, ByVal Order As String) As String Private Declare Function ComWW Lib "omron.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long, ByVal Sendstr As String, ByVal Order As String) As Long Private Declare Function ComMM Lib "omron.dll" (ByVal nport As Long, ByVal node As Long) As String Private Declare Function ComMS Lib "omron.dll" (ByVal nport As Long, ByVal node As Long) As Long Private Declare Function ComSC Lib "omron.dll" (ByVal nport As Long, ByVal node As Long, ByVal State As Long) As Long Private Declare Function ComTS Lib "omron.dll" (ByVal nport As Long, ByVal node As Long) As Long Private Declare Function ComFBitset Lib "omron.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long, ByVal Bit as Long, ByVal Order As String) As Long Private Declare Function ComFBitreset Lib "omron.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long, ByVal Bit as Long, ByVal Order As String) As Long Private Declare Function ComFRSset Lib "omron.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long, ByVal Sendstr As String, ByVal Order As String) As Long Private Declare Function ComFCancel Lib "omron.dll" (ByVal nport As Long, ByVal node As Long) As Long Private Declare Function ComSet Lib "omron.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long, ByVal Bit as Long, ByVal Order As String) As Long Private Declare Function ComReset Lib "omron.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long, ByVal Bit as Long, ByVal Order As String) As Long Private Declare Function ComTrue Lib "omron.dll" (ByVal nport As Long) As Long Private Declare Function CinBin Lib "omron.dll" (ByVal Chex As String, ByVal Start As Long) As Long 其它附加函数VB有实用函数,建议用VB自带函数,如需使用声明参上例; 做完上述声明后,便可以在程序中使用相关函数了。本DLL是串口通信库,通信时必须 先使用 ComOpen函数打开串口,在串口打开后可以有效操作相关函数,为保证通信可以在程序 运行开始时 打开串口,程序关闭前关闭串口。在应用程序关闭之前请务必将关闭所有串口,如您的 程序串口 未关闭前被关闭系统将抛出异常。当出现这样的异常请更改您的程序,确保应用程序在 关闭释放 前关闭打开的串口。 解决方法,在form的Unload事件中加入如下例: If ComTrue(1)=1 then ComClose(1) End if 为确保Unload事件有效执行程序中应使用“End”语句,而尽量使用“Unload”语句释放所有 窗体 ,因使用“End”语句系统不会执行正常的窗体释放等事件而直接退出程序,如程序中有 form1, form2两个窗体,则使用下面语句: Unload form1 Unload form2 VB会在所有窗体关闭后释放所有占用资源。 上述可以详细参照DEMO程序。 3、VC语言环境开发说明 在VC环境下将omron.dll、omron.slip(许可文件)复制到应用程序目录下(即将上述文 件与编译 后的可执行文件方入同一文件夹内); 在工程主文件cpp中声明一个句柄: HINSTANCE m_handle; 用来标识导入的动态链接库。 1)、导入动态链接库,如例所示: m_handle =:: LoadLibrary("omron.dll"); 2)、按下例说明声明相关各个函数: typedef long (CALLBACK* pOpen)(long nport, long BaudRate, long DataBits, long Parity, long StopBits, char* User); typedef long (CALLBACK* pClose)(long nport); typedef char* (CALLBACK* pWR)(long nport,long node, long address, long Count, char* Order); typedef long (CALLBACK* pWW)(long nport,long node, long address, char* Sendstr, char* Order); typedef char* (CALLBACK* pMM)(long nport,long node); typedef long (CALLBACK* pMS)(long nport,long node); typedef long (CALLBACK* pSC)(long nport,long node, long State); typedef long (CALLBACK* pTS)(long nport,long node); typedef long (CALLBACK* pFset)(long nport,long node, long address, long Bit, char* Order); typedef long (CALLBACK* pFReset)(long nport,long node, long address, long Bit, char* Order); typedef long (CALLBACK* pFRSset)(long nport,long node, long address, char* Sendstr, char* Order); typedef long (CALLBACK* pFCancel)(long nport,long node); typedef long (CALLBACK* pset)(long nport,long node, long address, long Bit, char* Order); typedef long (CALLBACK* pReset)(long nport,long node, long address, long Bit, char* Order); typedef long (CALLBACK* pTrue)(long nport); typedef long (CALLBACK* pBin)( char* Chex, long Start); typedef char* (CALLBACK* pIntHex)(long Cint,long Digits); typedef long (CALLBACK* pHexInt)( char* CHex); typedef char* (CALLBACK* pLeft)( char* Text, long Count); typedef char* (CALLBACK* pRight)( char* Text, long Count); typedef char* (CALLBACK* pMid)( char* Text, long Start, long Count); typedef long (CALLBACK* pinstr)( char* S, char* Substr); 3)、声明并建立动态链接库中的函数与新函数名的对应关系,如下: pOpen CMOpen = (pOpen)GetProcAddress(m_handle,"ComOpen"); pClose CMClose = (pClose)GetProcAddress(m_handle,"ComClose"); pWR CMWR = (pWR)GetProcAddress(m_handle,"ComWR"); pWW CMWW = (pWW)GetProcAddress(m_handle,"ComWW"); pMM CMMM = (pMM)GetProcAddress(m_handle,"ComMM"); pMS CMMS = (pMS)GetProcAddress(m_handle,"ComMS"); pSC CMSC = (pSC)GetProcAddress(m_handle,"ComSC"); pTS CMTS = (pTS)GetProcAddress(m_handle,"ComTS"); pFset CMFset = (pFset)GetProcAddress(m_handle,"ComFBitset"); pFReset CMFReset = (pFReset)GetProcAddress(m_handle,"ComFBitreset"); pFRSset CMFRSset = (pFRSset)GetProcAddress(m_handle,"ComFRSset"); pFCancel CMFCancel = (pFCancel)GetProcAddress(m_handle,"ComFCancel"); pset CMSet = (pset)GetProcAddress(m_handle,"ComSet"); pReset CMReset = (pReset)GetProcAddress(m_handle,"ComReset"); pTrue CMTrue = (pTrue)GetProcAddress(m_handle," ComTrue"); pIntHex CMIntHex = (pIntHex)GetProcAddress(m_handle," CIntToHex"); pHexInt CMHexInt = (pHexInt)GetProcAddress(m_handle," CHexToInt"); pBin CMBin = (pBin)GetProcAddress(m_handle," CinBin"); pLeft CMLeft = (pLeft)GetProcAddress(m_handle," CLeftStr"); pRight CMRight = (pRight)GetProcAddress(m_handle," CRightStr"); pMid CMMid= (pMid)GetProcAddress(m_handle," CMidStr"); pinstr CMinstr=(pinstr)GetProcAddress(m_handle," CinStr"); 注:双引号中为动态链接库中的函数名。 4)、接下来就可以自由使用动态链接库中的函数了,如: CMOpen(参数略); CMClose(参数略); CMWR(参数略); CMWW(参数略); CMMM(参数略); CMMS(参数略); CMSC(参数略); CMTS(参数略); CMFset(参数略); CMFReset(参数略); CMFRSset(参数略); CMFCancel(参数略); CMSet(参数略); CMReset(参数略); CMTrue(参数略); CMIntHex(参数略); CMHexInt(参数略); CMBin(参数略); CMLeft(参数略); CMRight(参数略); CMMid(参数略); CMinstr(参数略); 注:函数中用到了char*型参数,这里介绍下char*与Cstring的相互转换的函数: 1)char*->CString char* sz; CString str; str.Format("%s",sz); //可以用此函数将读取得值转成字符串 2) CString -> char* CString str; char* sz = str.GetBuffer(0);//可将字符串转成char*给函数赋值 5)、当不再需要使用DLL时记得关闭串口及释放动态链接库,如: 关闭串口 if CMTrue(1)==1 then { CMClose(1); } 6)、释放DLL FreeLibrary(m_handle); 注:对于各位使用VC及其他开发环境的朋友,我表示歉意因为我不太使用这类软件所 以就不再写 DEMO程序了,VC的参照上述声明我做过测试是可以使用你的,其他开发环境我没有 测试不能保证 您可以使用。 DEMO中默认的PLC站号(单元号或称节点号),0;
/
本文档为【通信协议串口动态链接库】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索