PC(上位机)与PLC串行通讯协议与串口DLL之 modbus rtu 协议(2)

2019-08-26 18:02

Delphi:ComOpen(1,9600,8,1,1,Pchar('wangjun')) , 打开COM1口。

VB:ComOpen(1,9600,8,1,1,\打开COM1口。(注:下面的示例都以VB调用形式给出)

2、关闭串口

Function ComClose(nport:longint):longint;stdcall;

参数:nport: 串口号,取值为1~8,代表COM1~COM8;

返回值:长整型,操作成功返回“1”,否则返回“0”;

使用举例:

ComClose(1) ,关闭打开的COM1口。

3、modbus相应功能码所对应的读取功能函数。

1)、01功能码位元件的读取(读取一组线圈)

Function FCN01(nport,node,address,Count:longint):Pchar;stdcall;

参数:

nport: 串口号,取值为1~8,代表COM1~COM8;

node: modbus从站号,取值1~255;

address: 元件地址,取值范围从00001~0XXXX地址区(逻辑线圈)值(你要读标准modbus的00001地址这个值为0000,依次类推)

Count: 读取的位元件个数,一次最多读取1000个但不能超出寻址范围;

返回值: 16进制字符串数据,字符串数据的终止符为\

使用举例:

FCN01(1,1,19,37),由COM1读取modbus 1号从站00020~00056(标准modbus地址)的位状态值,返回值为“CD6BB20E1B@”

则表示27~20:CD, 35~28:6B, 43~36:B2, 51~44:0E, 56~52:1B;

字节值与实际的位状态值对应参考(其他位功能函数的说明不再重复本内容):

位地址: | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 35 | 34 | 33 | 32 | 31 | 30 | 29 | 28 |

-----------------------------------------

各位赋值: | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 |

-----------------------------------------

16进制串: | C | D | 6 | B |

-----------------------------------------

不足8位的位组的状态值参考:

位地址: | 56 | 55 | 54 | 53 | 52 | ------------- 各位赋值: | 0 | 1 | 0 | 1 | 1 |

------------- 16进制串: | 1 | B |

-------------

在读取错误或不能读取的情况下返回“Error@”

注:没有注册的用户只能读取00001~00006范围的状态值;

2)、02功能码位元件的读取(取得一组开关输入状态数据)

Function FCN02(nport,node,address,Count:longint):Pchar;stdcall;

参数:

nport: 串口号,取值为1~8,代表COM1~COM8;

node: modbus从站号,取值1~255;

address: 元件地址,取值范围从10001~1XXXX地址区(开关输入状态)值(你要读标准modbus的10001地址这个值为0000,依次类推)

Count: 读取的位元件个数,一次最多读取1000个但不能超出寻址范围;

返回值: 16进制字符串数据,字符串数据的终止符为\

使用举例:

FCN02(1,1,196,22),由COM1读取modbus 1号从站10197~10218(标准modbus地址)的

位状态值,返回值为“ACDB35@”

则表示10204~10197:AC, 10212~10205:DB, 10218~10213:35;

在读取错误或不能读取的情况下返回“Error@”

注:没有注册的用户只能读取10001~10006范围的状态值;

3)、03功能码字元件的读取(读多个保持寄存器数据)

Function FCN03(nport,node,address,Count:longint):Pchar;stdcall;

参数:

nport: 串口号,取值为1~8,代表COM1~COM8;

node: modbus从站号,取值1~255;

address: 元件地址,取值范围从40001~4XXXX地址区(保持寄存器数据)值(你要读标准modbus的40001地址这个值为0000,依次类推)

Count: 读取的位元件个数,一次最多读取60个但不能超出寻址范围;

返回值: 16进制字符串数据,字符串数据的终止符为\

使用举例:

FCN03(1,1,107,3),由COM1读取modbus 1号从站40108~40110(标准modbus地址)的字状态值,返回值为“022B00000064@”

则表示40108:022B, 40109:0000, 40110:0064;

在读取错误或不能读取的情况下返回“Error@”

注:没有注册的用户只能读取40001~40003范围的状态值;

4)、04功能码字元件的读取(读多个输入寄存器数据)

Function FCN04(nport,node,address,Count:longint):Pchar;stdcall;

参数:

nport: 串口号,取值为1~8,代表COM1~COM8;

node: modbus从站号,取值1~255;

address: 元件地址,取值范围从30001~3XXXX地址区(输入寄存器数据)值(你要读标准modbus的30001地址这个值为0000,依次类推)

Count: 读取的位元件个数,一次最多读取60个但不能超出寻址范围;

返回值: 16进制字符串数据,字符串数据的终止符为\

使用举例:

FCN04(1,17,8,1),由COM1读取modbus 17号从站30009(标准modbus地址)的字状态值,返回值为“000A@”

则表示30009:000A;

在读取错误或不能读取的情况下返回“Error@”

注:没有注册的用户只能读取30001~30003范围的状态值;

4、modbus相应功能码所对应的写入功能函数

1)、05功能码线圈的置复位功能函数

1、线圈置位

Function FCN05S(nport,node,address:longint):longint;stdcall;

参数:

nport: 串口号,取值为1~8,代表COM1~COM8;

node: modbus从站号,取值1~255;

address: 元件地址,取值范围从00001~0XXXX地址区(逻辑线圈)值(你要写标准modbus的00001地址这个值为0000,依次类推)

返回值: 长整数,操作成功返回1,不能写入或操作错误返回0;

使用举例:

FCN05S(1,12,15),由COM1将modbus 12号从站00013(标准modbus地址)的位状态值置1,返回值为1表示成功

注:没有注册的用户只能写入00001~00006范围的状态值;

2、线圈复位

Function FCN05R(nport,node,address:longint):longint;stdcall;

参数:

nport: 串口号,取值为1~8,代表COM1~COM8;

node: modbus从站号,取值1~255;

address: 元件地址,取值范围从00001~0XXXX地址区(逻辑线圈)值(你要写标准modbus的00001地址这个值为0000,依次类推)

返回值: 长整数,操作成功返回1,不能写入或操作错误返回0;

使用举例:

FCN05R(1,12,15),由COM1将modbus 12号从站00013(标准modbus地址)的位状态值置0,返回值为1表示成功

注:没有注册的用户只能写入00001~00006范围的状态值;

2)、06功能码预置单保持寄存器数据功能函数

Function FCN06(nport,node,address:longint;Sendstr:pchar):longint;stdcall;

参数:

nport: 串口号,取值为1~8,代表COM1~COM8;

node: modbus从站号,取值1~255;

address: 元件地址,取值范围从40001~4XXXX地址区(保持寄存器)值(你要写标准modbus的40001地址这个值为0000,依次类推)

Sendstr: 写入字值,该值为4个一组的16进制字符串组成其取值为0000~FFFF(整数值为0~65535);

返回值: 长整数,操作成功返回1,不能写入或操作错误返回0;

当要写入字值时依次排列即可。如给40001写值1000,先将1000转成16进制字符串03E8,则sendstr=03E8;


PC(上位机)与PLC串行通讯协议与串口DLL之 modbus rtu 协议(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:强制清算中应注意的问题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: