Modbus 本身是一种信息交换的规范,Modbus RTU则是透过串口来实现Modbus 的一种方式,因此所有的信息都是通过串口来传输的;Modbus协议属于 C/S 架构,Modbus Rtu Slave是一种Server用来存放所有要被读取的工业设备数据;
使用场景
整体架构
Modbus Tcp是通过串口来实现Modbus的一种方式,Modbus Rtu Master可以对Rtu Slave发送读或者写的指令,Slave收到指令后会回复确认信息,整个Modbus的沟通建立在一来一回的讯息交换上;
下表概述了各个产品组件
产品组件 | 描述说明 |
---|---|
modbusslave_0.0.5_amd64.deb | Modbus rtu slave RTE组件 |
modbusslave.library | 上位机程序使用的库文件 |
安装要求
中科时代出厂的工智机;
工智机可以访问互联网;
熟悉基础的Linux操作命令;
安装过程
工智机端安装Modbus Tcp Slave RTE组件
上传deb包到工智机Linux环境的/home/sinsegye目录下
上传完成后在工智机上执行命令安装(参考下方截图,如果模块文件名发生变化则命令行中的文件名做相应更改)
cd $HOME
sudo dpkg -i modbusslave_0.0.5_amd64.deb
sudo nano /usr/local/etc/SinsegyeRTE/SinsegyeRTE.cfg
ComponentManager]
Component.0=retainDeamon
Component.1=CmpCanBusUtils
Component.2=CmpSinsegyeLibs
Component.3=SinsegyeCmp
Component.4=modbusslave
sudo systemctl restart sinsegyerte.service
Metafacture安装library
打开Metafacture,点击“工具” -- “库存储”
点击“安装” -- 选中modbus slave的库文件,点击“打开”
工程中点击“库管理器” -- “添加库” -- 选中modbus库点击“确定”
更新安装
工智机端升级Modbus Tcp Slave RTE组件
上传deb包到工智机Linux环境的/home/sinsegye目录下
上传完成后在工智机上执行命令安装(参考下方截图,如果模块文件名发生变化则命令行中的文件名做相应更改)
cd $HOME
sudo dpkg -i modbusslave_0.0.5_amd64.deb
sudo systemctl restart sinsegyerte.service
Metafacture升级library
打开Metafacture,点击“工具” -- “库存储”
点击“安装” -- 选中要升级的modbus slave的库文件,点击“打开”
工程中点击“库管理器” -- “添加库” -- 选中modbus库点击“确定”
卸载过程
工智机端卸载Modbus Tcp Slave RTE组件
sudo dpkg -r modbusslave
sudo nano /usr/local/etc/SinsegyeRTE/SinsegyeRTE.cfg
sudo systemctl restart sinsegyerte.service
卸载MetaFacture侧的Modbus Tcp slave library
MetaFacture界面点击“工具” -- “库存储”
对话框中选中安装的modbus slave的库,点击“卸载”
快速启动
本例软、硬件配置
硬件:
SX5100工智机 MetaOS V24.08.15_SX5
Win10 PC
软件:
MetaFacutre V1.0.6.3
Modbus Poll主站工具
本例实验要求及原理
实验原理
第三方Modbus Rtu主站通过串口连接向Metafacture Modbus Rtu 从站发送请求,主要包含:功能码、目标寄存器的地址和数量、写操作时的数据;从站收到请求后先检查数据的合法性,然后执行请求的操作,响应主站请求;
上位机和工智机使用EtherNet连接。
上位机上,MetaFacture下装工程到工智机。工程中会包含下面的试验操作步骤中的配置。
工智机与第三方Modbus Rtu主站通过串口连接。
本例实验操作步骤
新建Modbus tcp slave工程的实验步骤如下:
PROGRAM rtu_slave
VAR
FB_Modbus_Com_Slave_0 : ModbusSlave.FB_Modbus_Com_Slave;
bxEnable : BOOL:=TRUE;
pbyCoilA : ARRAY [0..2048] OF BOOL;
pbyDiscreteInputA : ARRAY [0..2048] OF BOOL;
pbyInputRegisterA : ARRAY [0..2048] OF WORD;
pbyHoldingRegisterA : ARRAY [0..2048] OF word;
bBusy : BOOL;
bActive : BOOL;
bError : BOOL;
eError : BOOL;
ulRecvCounter : UDINT;
ulSendCounter : UDINT;
END_VAR
FB_Modbus_Com_Slave_0(
bEnable :=bxEnable ,
uiSlaveId :=1 ,
comPort :=ModbusSlave.COM_PORT.ttys6 , //SX5 ttys6、 SX58 ttyS0、SX2 ttyS0;
baudrate :=ModbusSlave.SERIAL_BAUDRATE.baudrate_115200 ,
byteSize :=ModbusSlave.SERIAL_DATABIT.databit_8 ,
parity :=ModbusSlave.SERIAL_PARITY.parity_no , //主站也要同步设置成这样
stopBits :=ModbusSlave.SERIAL_STOPBIT.stopbit_1 ,
udiTimeOut :=10000 ,
psMbTest := ,
pbyCoil :=ADR(pbyCoilA),
pbyDiscreteInput :=ADR(pbyDiscreteInputA),
pbyInputRegister :=ADR(pbyInputRegisterA),
pbyHoldingRegister :=ADR(pbyHoldingRegisterA),
udiRwBitSize :=SIZEOF(pbyCoilA),
udiInBitSize :=SIZEOF(pbyDiscreteInputA),
udiInWordSize :=SIZEOF(pbyInputRegisterA),
udiRwWordSize :=SIZEOF(pbyInputRegisterA),
bBusy=> ,
bActive=> ,
bConnect=> ,
bError=> ,
eError=> ,
ulRecvCounter=> ,
ulSendCounter=> );
输入参数
参数名称 | 参数类型 | 描述 |
---|---|---|
bEnable | BOOL | 启动modbus rtu slave |
uSlaveId | UINT | 从站id信息 |
comPort | COM_PORT | 串口号,例如COM_PORT.ttys6 |
comPortStr | STRING | comPort参数只支持到/ttys8;如遇到大于8的或者其他串口设备,请使用comPortStr变量,如comPortStr := '/dev/ttys9; |
baudrate | SERIAL_ | 波特率设置,有baudrate_9600、baudrate_115200 两种配置 |
byteSize | SERIAL_DATABIT | 串口传输数据位,可配置databit_4、databit_5、databit_6、databit_7、databit_8五种配置 |
parity | SERIAL_PARITY | 串口通信校验方式,有parity_no、parity_odd、parity_even 三种 |
stopBits | SERIAL_STOPBIT | 串口通信停止位,有stopbit_1、stopbit_1_5、stopbit_5 三种 |
udiTimeOut | UDINT | 超时时间 |
psMbTest | INT | 默认0,Modbus测试用数据,默认不用配置 |
pbyCoil | POINTER TO BYTE | 从站线圈,可读可写 |
pbyDiscreteInput | POINTER TO BYTE | 从站离散输入,只读 |
pbyInputRegister | POINTER TO BYTE | 从站保持寄存器,可写可读 |
pbyHoldingRegister | POINTER TO BYTE | 从站输入寄存器,只读 |
udiRwBitSize | UDINT | 以位可读写寻址的最大个数,用于线圈 |
udiInBitSize | UDINT | 以位可读寻址的最大个数,用于离散输入 |
udiInWordSize | UDINT | 以字可读寻址的最大个数,用于输入寄存器 |
udiRwWordSize | UDINT | 以字可读写寻址的最大个数,用于保存寄存器 |
输出参数
参数名称 | 参数类型 | 描述 |
---|---|---|
bBusy | BOOL | 当功能块被激活时,被置为True,一直保持到收到确认信号 |
bActive | BOOL | Modbus从站激活标志位 |
bConnect | BOOL | Modbus连接成功标志位 |
bError | BOOL | 错误标志位。True为报错,False无报错 |
eError | BOOL | 错误反馈id |
uIRecvCounter | ULINT | 数据接收计数器 |
uISendCounter | ULINT | 数据发送计数器 |