JZGKCHINA
工控技术分享平台
一
通讯篇
1、个人经验,基于以太网的通讯协议,通讯速率由快到慢,依次顺序 TCP/IP, Pvi, ModbusTCP, OPC…
1.2 DEVICE接口描述
格式:[SL<x>].[SS<x>].[IF<x>]
SL ... 槽号
SS ... 扩展槽号
IF ... 通讯接口 IF 号<x>
例如:
IF2: CPU 自带的第 2 个通讯口
SS1.IF1: CPU 第 1 个扩展槽模块的第 1 个通讯口
1.2.1.1 pMODE
[<Type>],[<Baud rate>],[<Parity>],[<Data bits>],[<Stop bits>],[<Options>],[<Idle>]
Type: 接口类型,分为 RS232, RS422, RS485, TTY, RS485TxE ("RS485" Tx echo) or 或 RS422BUS 等。默认值 RS232
baud rate: 波特率,分为 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600 or 115200。默认值 57600
↘ N ... 无校验
↘ O ... 奇校验
↘ E ... 偶校验
↘ H ... High forced parity
↘ L ... Low forced parity
Data bits: 数据位,分为 (默认值 8)
↘ 7 ... 7 数据位
↘ 8 ... 8 数据位
↘ 1 ... 1 位停止位
↘ 2 ... 2 位停止位
Options: 如果是 RS232 接口,还可以设置以下参数
↘ HW ... 硬件握手协议(请求发送/清除发送)
↘ RT ... 外部控制的耦合器(INT1)RTS 电缆
Idle: 字符之间允许最大空闲时间
收到两个连续字符之间的时间间隔称为“空闲时间”。如果这段时间超过设定的最大值(最大空闲时间之间的字符),控制器认为帧数据传输完成。一个字符的长度作为单位的空闲时间。
例如:
"19200,7,E,1"
"RS485,N,8,1,9600"
例如:
"/PHY=RS485 /PA=N /DB=8 /SB=1 /BD=9600"
1.3 MOBUS通讯
Programming –> Libraries -> Communication -> DRV_mbus
Modbus 功能码一览(常用)
功能码 | 名称 | 作用 |
---|---|---|
01 | 读取线圈状态 | 取得一组逻辑线圈的当前状态(ON/OFF) |
02 | 读取输入状态 | 取得一组开关输入的当前状态(ON/OFF) |
03 | 读取保持寄存器 | 在一个或多个保持寄存器中取得当前的二进制值 |
04 | 读取输入寄存器 | 在一个或多个输入寄存器中取得当前的二进制值 |
05 | 强置单线圈 | 强置一个逻辑线圈的通断状态 |
06 | 预置单寄存器 | 把具体二进值装入一个保持寄存器 |
15 | 强置多线圈 | 强置一串连续逻辑线圈的通断 |
16 | 预置多寄存器 | 把具体的二进制值装入一串连续的保持寄存器 |
硬件平台:RS232、RS422、RS485。
1.3.4.1 PDEVICE
device 接口参数,用于指定系统哪个接口。
1.3.5 MOBUS 通讯 – 主站
1.3.5.1 主站函数
MBMOpen 函数
MBMaster 函数
正常通讯时:
Status 返回值为 0
1.3.5.2 贝加莱例程 -MBUS_MAST 任务
mbus_mast 任务说明
第 1 步,用 MBMOpen 函数打开端口,得到端口的 ident。
第 2 步,打开端口后,MBMaster 函数不断地执行进行主站数据收发。
其他,如有需要,用 MBMClose 函数关闭端口通讯。
1.3.5.2.1 数据模块
主要定义通讯变量内容:
从站:站号、功能码、寄存器起始地址、寄存器长度
主站:相对应的变量名
1.3.6 MOBUS 通讯 – 从站
1.3.6.1 从站函数
MBSOpen 函数
关于 pCoilStat, pInputStat, pInputReg, pHoldingReg , 如果 pCoilStat, pInputStat, pInputReg, pHoldingReg 为 0 时,采用默认的 MB0、MB1、MB3、MB4。
或者
可以自定义成其他变量名。例如,定义 CoilStat 为 BOOL[0..99]、InputStart 为 BOOL [0..99]、InputReg 为 UINT[0..99]、HoldingReg 为 UINT [0..99]分别替换 MB0、MB1、MB4、MB3。
MBSlave 函数
I/O | 参数 | 数据类型 | 描述 |
---|---|---|---|
IN | enable | BOOL | 使能 |
IN | ident | UDINT | MBSOpen 功能块得到的 ID |
OUT | status | UINT | 错误号(0=无错误) |
OUT | exec | UINT | Modbus 执行次数 |
正常通讯时:
Status 返回值为 0
Exec 返回值不断加 1。每收到主站数据命令,Exec 加 1。
说明 1:贝加莱 Modbus 从站只支持 RTU 模式,主站 RTU 和 ASCII 模式都支持。
1.4.1.1 贝加莱例程 -MBUS_SLAV 任务
mbus_slav 任务说明
第 1 步,用 MBSOpen 函数打开端口,得到端口的 ident。
第 2 步,打开端口后,MBSlave 函数不断地执行进行从站数据收发。
其他,如有需要,可以用 MBSClose 函数关闭端口通讯。
1.4.1.2 地址对应
备注:
Y=X+1。例如,Modbus 的 400002 对应贝加莱从站 MB4[1]。
如需在 B&R 系统中仿真,必须采用 MBx。
1.4.2 MOBUS 通讯常见错误号
20220:
MBSOpen() 或 MBMOpen() 功能块 timeout 参数错误(不能 < 250 ms)MBMCmd(), MBMaster() 或 MBSlave() 功能块通讯检测超时(通常是在没通讯上时,会报此错误)
1.4.3 案例 – 贝加莱 CPU 跟西门子 S7-200 MODBUS 通讯
见文档“贝加莱 PCC 和西门子 200modbus 通信.pdf”
1.4.4 案例 – 贝加莱 CPU 跟 PRO-FACE MODBUS 通讯
实际测试结果:
C4.05 操作系统,X20CP1583 做从站,Pro-face 屏做主站,RS232 交叉连接,偶校验,8 位数据位,1 位停止位。
波特率为 19200 时,Exce 数据不断加 1,但是 MB4 数据收不到。
波特率为 9600 时,能够正常收发数据。
1.5 DVFRAME帧通讯
1.5.1 AS 帮助
Programming –> Libraries -> Communication -> DVFrame
1.5.1.1 相关函数
1、 FRM_xopen 函数
打开通讯端口。
Config 配置参数
关于 delimc 和 delim
delimc = 0: delim 的参数无效
delimc 不等于 0: delim 的参数有效
↘ delimc = 1: delim[0]参数有效
↘ delimc = 2: delim[0]和 delim[1]参数有效
2、 FRM_read 函数
接收数据。
3、 FRM_write 函数
发送数据。
4、 FRM_close 函数
关闭端口通讯。
5、 FRM_ rbuf 函数
接收缓存区数据释放。
当接收缓存区接收到数据后,需要通过此函数将缓存区数据清空。如果有多个缓存区,可能要等到数据都接收完才清空。
6、 FRM_gbuf 函数
此函数可以得到发送缓存区。缓存区地址和长度可以通过此函数得到。
1.5.1.2 贝加莱例程 - LIBDVFRAME1_ST 和LIBDVFRAME2_ST
LibDVFrame1_ST 例程
发送和接收分成两个任务。
任务基本框架:打开端口 -> 发送/接收数据 -> 关闭端口(可选项)
LibDVFrame2_ST 例程
发送和接收合在一个任务里。
备注:通常 FRM_read 函数不断执行(即不断接收数据),FRM_write 函数只在有需要发送数据时,执行。
作者简介
陈斌斌
深圳信通环球科技有限公司创始人
2008年毕业于山东大学 电力电子与电力传动专业 硕士
先后就职于贝加莱工业自动化(中国)有限公司、奥海自动化系统(深圳)有限公司,于2015年创立深圳信通环球科技有限公司,为自动化行业客户提供“运动控制+视觉+工控机”系统集成,主要完成的系统有吹瓶机电控系统、称重失重控制系统、瓦楞纸整线电气控制系统、三次元机械手系统、磁悬浮搬运机械手系统、印刷机电气控制系统、视觉轮廓检测、3C电子组装贴合视觉定位等;