您现在所在的是:

电工技术

回帖:2个,阅读:2908 [上一页] [1] [下一页]
1282
wjun7610
文章数:138
年度积分:53
历史总积分:1282
注册时间:2004/6/19
发站内信
发表于:2007/9/21 19:58:00
#0楼

DEMO中默认的PLC站号(单元号或称节点号)=0;


最新欧姆龙PLC全系列Host Link通信协议串口动态链接库DLL(附VB/Delphi实用DEMO程序)


一、最新欧姆龙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;
返回值:长整型,测试成功返回1,否则返回0;

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;
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;

使用举例:
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中关于传出字符串值的函数都以"@"为字符串函数值终止符。
953
vblyx
文章数:1
年度积分:50
历史总积分:953
注册时间:2008/9/17
发站内信
发表于:2008/9/17 15:29:00
#1楼
good
1233
wozaitanxi
文章数:48
年度积分:50
历史总积分:1233
注册时间:2005/4/14
发站内信
发表于:2008/12/2 19:34:00
#2楼
怎么没有人顶呢(!!!
我是做程序的,经常用欧姆龙的PLC,想做一个与PLC通讯的程序,但是vb又不是很好,学习一下,如果有实际的程序或者源码就好了(!希望发一份给我(!谢谢
我的邮箱wOzaitanxi@163.cOm

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2025 Gkong.com, All Rights Reserved

78.0005