一、最新三菱PLC FX系列PLC编程口通信协议动态链接库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:longint;User:Pchar):longint;stdcall;
参数:nport: 打开串口号,取值为1~8,代表COM1~COM8;
User:DLL授权用户名;
返回值:长整型,操作成功返回1,否则返回0;打开串口不成功即返回0时的原因:1)、串口不存在或被占用; 2)、DLL试用过期; 3)、DLL授权注册不正确。
使用举例:
ComOpen(1,'wjun') , 打开COM1口。
2、关闭串口
Function ComClose(nport:longint):longint;stdcall;
参数:nport: 串口号,取值为1~8,代表COM1~COM8;
返回值:长整型,操作成功返回1,否则返回0;
使用举例:
ComClose(1) ,关闭打开的COM1口。
3、PLC存储器的预置(D)
Function ComDWrite(nport,address:longint;sendstr:pchar):longint;stdcall;
参数:
nport: 串口号,取值为1~8,代表COM1~COM8;
address: 寄存器地址,取值为0~4095(此值需根据不同的PLC操作选择合适的地址范围);
sendstr: 给寄存器写入的值,该值为4个一组的16进制字符串组其取值为0000~FFFF(整数值为0~65535),当要写入多个寄存器值时依次排列即可。如给D0与D1写值100和1000,先将100转成16进制字符串0064、1000转成16进制字符串03E8,则sendstr=006403E8;一次最多写32个寄存器即字符串长应小于等于128;
---------- ---- ~ ---------
写字符串序列如: | 0000 | FFFF | 0010 | 0064 | ~ | 0010 | 0064 |
---------- ---- ~ ---------
返回值:长整型,操作成功返回1,否则返回0;
使用举例:
ComDwrite(1,0,‘006403E8’),由串口1预置值D0=100,D1=1000。
4、PLC存储器的读取(C、D、T)
Function ComDRead(nport,address,Count:longint;element:Pchar):Pchar;stdcall;
参数:
nport: 串口号,取值为1~8,代表COM1~COM8;
address: 寄存器地址,取值为D区0~4095、C、T(定时器/计数器当前值)区0~255;
Count: 读取寄存器个数,最多读取32个寄存器;DLL读取的越界会自动舍去
element:元件名称,支持D、C、T;
返回值:字符串数据,字符串数据的终止符为"@";
使用举例:
ComDRead(1,0,4,'D') ,由COM1读取D0~D3四个寄存器的值,如返回值为“0001006403E809F0@”,则表示D0=0001, D1=0064,D2=03E8,D3=09F0;
---------- ---- ---
读字符串序列如: | 0001 | 0064 | 03E8 | 009F | | @ |
---------- ---- ---
返回值为16进制字符串,可以将返回值如上四位一组再转换成“0~65535”的整数值。
5、PLC的多线圈强置(C、M、S、T)
Function ComEForce(nport,address:longint;element,sendstr:pchar):longint;stdcall;
参数:
nport: 串口号,取值为1~8, 代表COM1~COM8;
address: 位单元地址,定时器C:0~255、M:0~2047、S:0~999、T:0~255、特M: M8000~M8255;
element:元件名称,支持C、M、S、T;
sendstr: 给多线圈写入的值,该值为2个一组的16进制字符串组其取值为00~FF(整数值为0~255),当要写入多个值时依次排列即可。例如: 字节地址C0'(实际由位地址位C0~C7)、字节地址C1'(实际由位地址位C8~C15),如给C0'赋值80、C1'赋值CF,则sendstr=80CF;一次最多写64个字节,即字符串长应小于等于128;
---------- - ~ ------
写字符串序列如: | 00 | FF | 10 | 64 | ~ | 1F | 48 |
---------- - ~ ------
实际字符串与位地址的数值应如下表:(将上例的字节C0'、C1'转换为位地址C0~C15由下表对应)
------------------------------------
位地址: | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 |
------------------------------------
各位赋值: | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 |
------------------------------------
16进制串: | 8 | 0 | C | F |
------------------------------------
返回值:长整型,操作成功返回1,否则返回0;
使用举例:
ComEForce(1,0,‘C’ ,‘80CF’),DLL将按上表给相应位强置值,这里地址address赋值0~7都是给C0~C15的强置值,因实际字节地址=address div 8 (0~7 div 8 都等于0,即都是给C0'、C1'强置值)。
字节地址如Mx' = address div 8 ,M、S、C、T都按此公式计算如何给实际的位地址强置值。
6、PLC的多线圈读取(C、M、S、T、X、Y)
Function ComERead(nport,address,Count:longint;element:Pchar):Pchar;stdcall;
参数:
nport: 串口号,取值为1~8,代表COM1~COM8;
address: 位单元地址,定时器C:0~255、M:0~2047、S:0~999、T:0~255、X:0~177(8进制)、Y:0~177(8进制)、特M: M8000~M8255;
Count: 读取字节个数,最多读取64个字节;
element:元件名称,支持C、M、S、T、X、Y;
位单元的字节组成按8个位一组,如56(16进制)则表示下表的位构造值。
----------------
位地址: | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
----------------
各位赋值: | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 |
----------------
16进制串: | 5 | 6 |
----------------
使用举例:
ComERead(1,0,1,‘M’),如返回56(16进制)则M0~M7的值为上表反应的结果。0~255的位地址映射成字节地址应为0~31。
即:实际地址=address / 8 ,如ComERead(1,11,2,‘C’)相应都得是C8~C15与C16~C23组合的两个字节的值,例如返回值为“870A@”
-----------------------------------------
位地址:| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | @ |
-----------------------------------------
各位赋值:| 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | @ |
-----------------------------------------
16进制串:| 8 | 7 | 0 | A | @ |
-----------------------------------------
"@"为字符串数据的终止符。
DLL还提供附加函数CinBin ,可以读出字节中相应位的值是1还是0。
对于X、Y区线圈地址可以按8进制地址转换成10进制后再参照上表的地址映射关系。
7、PLC的线圈置位(C、M、S、T)
Function ComESet(nport,address:longint;element:Pchar):longint;stdcall;
参数:
nport: 串口号,取值为1~8,代表COM1~COM8;
address: 位单元地址,定时器C:0~255、M:0~1023、S:0~999、T:0~255、X:0~177、Y:0~177及特M: M8000~M8255;
element:元件名称,支持C、M、S、T;
使用举例:
ComESet(1,0,‘C’),由COM1给C0置位;
ComESet(1,8010,‘M’), 由COM1给M8010置位;
8、PLC的线圈复位(C、M、S、T)
Function ComEReset (nport,address:longint;element:Pchar):longint;stdcall;
参数:
nport: 串口号,取值为1~8,代表COM1~COM8;
address: 位单元地址,定时器C:0~255、M:0~1023、S:0~999、T:0~255、X:0~177、Y:0~177及特M: M8000~M8255;
element:元件名称,支持C、M、S、T;
使用举例:
ComEReset(1,0,‘T’),给T0复位;
ComEReset (1,810,‘S’),给S810复位;
三、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进制字符串转 |