最近工作上需要使用到欧姆龙PCL与视觉通信,并且采集部分数据,本来打算合作对象打算通过编写plc端的串口程序进行采集的,但是以前做过相关的程序,果断拒绝,采用PLC自带的hostlink报文读写。
有人问为什么不用Modubus TCP进行采集,我只能说条件有限,并不是我选购的标准件。
本次使用的设备型号:欧姆龙CP1H,串口模块:CP1W-CIF01
报文说明
- 帧开始标志 @
- 站号 0–31
- 识别码 ”FA” “RD” “WR”
- 超时时间 默认为0*10ms
- ICF\DA2\SA2\SID各占一个字节默认为00 具体可参考 HOSTLINK 通讯参考手册 W342-E1-15 第 3-3-3 节
- 读写指令,0101读,0102写
- 内存区域见下图
- 内存地址 6位16进制数表示如100.01为0064 01
- 数据长度,根据需要改变,十六进制数如0001
- 写入数据 如1234
- XOR校验,见文章:C#计算按位异或校验和XOR
- 结束标志:*+换行符
以上内容均需使用16进制表示
FINS常用命令表
类型 | 命令符MR | 命令符SR | PLC运行模式 | 监视模式 | 编程模式 | 功能 |
I/O存储区 | 1 | 1 | 有效 | 有效 | 有效 | 读连续I/O存储区的数据 |
I/O存储区 | 1 | 2 | 有效 | 有效 | 有效 | 写连续I/O存储区的数据 |
I/O存储区 | 1 | 3 | 有效 | 有效 | 有效 | 向I/O存储区中指定范围写相同的数据 |
I/O存储区 | 1 | 4 | 有效 | 有效 | 有效 | 读指定非连续I/O存储区的数据 |
I/O存储区 | 1 | 5 | 有效 | 有效 | 有效 | 复制连续I/O存储区的数据到另一连续存储区 |
改变操作模式 | 4 | 1 | 有效 | 有效 | 有效 | 让PLC运行,将模式改为运行或监视 |
改变操作模式 | 4 | 2 | 有效 | 有效 | 有效 | 让PLC停止,将模式改为编程 |
读配置 | 5 | 1 | 有效 | 有效 | 有效 | 读CPU单元数据 |
读状态 | 6 | 1 | 有效 | 有效 | 有效 | 读CPU单元状态 |
存储区代码
区域 | 区域 | 数据类型 | CS/CJ/ CP存储区代码(HEX) | CV存储区代码 (HEX) | 一个字符所占字节 |
CIO区 | CIO | 位 | 30 | 0 | 1 |
工作区 | WR | 位 | 31 | — | 1 |
保持区 | HR | 位 | 32 | — | 1 |
辅助区 | AR | 位 | 33 | 0 | 1 |
CIO区 | CIO | 字 | B0 | 80 | 2 |
工作区 | WR | 字 | B1 | — | 2 |
保持区 | HR | 字 | B2 | — | 2 |
辅助区 | AR | 字 | B3 | 80 | 2 |
定时器区 | TIM | 完成标志 | 9 | 1 | 1 |
计数器区 | CNT | 完成标志 | 9 | 1 | 1 |
定时器区 | TIM | 当前值 | 89 | B1 | 2 |
计数器区 | CNT | 当前值 | 89 | B1 | 2 |
D区 | D | 位 | 2 | — | 1 |
D区 | D | 字 | 82 | 82 | 2 |
EM区 | EM库0-EM库C | 位 | 20-2C | — | 1 |
EM区 | EM库0-库F | 字 | A0-AC | 90-97 | 2 |
EM区 | EM当前库 | 字 | 98 | 98 | 2 |
EM区 | EM当前库号 | EM当前库号 | BC | 9C | 2 |
任务标志 | TK | 位 | 6 | — | 1 |
任务标志 | TK | 状态 | 46 | — | 1 |
变址寄存器 | IR | 当前值 | DC | — | 4 |
数据寄存器 | DR | 当前值 | BC | 9C | 2 |
时钟脉冲 | 时钟脉冲 | 位 | 7 | — | 2 |
时钟脉冲 | 时钟脉冲 | 位 | 7 | — | 2 |
发送报文格式
帧开始标志+PLC站号(2字节)+识别码+超时时间+ICF\DA2\SA2\SID各占一个字节默认为00+写指令+内存区域+内存地址+写入数据长度+写入数据+XOR校验+*CR
示例:写D100内容1234
ASCII: @00FA0000000000102820064000001123479*CR
十六进制:4030304641303030303030303030303130323832303036343030303030313132333437392A0D
响应格式
@ 00 FA 00 40 00 00 00 01 02 00 00 40 *CR
读报文格式
帧开始标志+PLC站号(2字节)+识别码+超时时间+ICF\DA2\SA2\SID+读指令+内存区域+内存地址+XOR校验+*CR
示例:读D100内容
ASCII: @00FA00000000001018200640000017E*CR
十六进制:40303046413030303030303030303031303138323030363430303030303137450A2A0D
响应内容:@ 00 FA 00 40 00 00 00 01 01 00 00 1234 40 *CR
注意:布尔类型数据写入为01不是0001,例如写输出100.00,ASCII: @00FA000000000010230006400000101+XOR+*CR
常见响应状态码
主代码 | 子代码 | 内容 |
0 | 0 | 正常完成 |
3 | 1 | 通信单元/通信板错误 |
3 | 2 | CPU单元错误 |
3 | 4 | 单元号错误 |
4 | 1 | 命令符未定义 |
4 | 2 | 单元型号/版本不正确 |
10 | 1 | 命令格式太长,超出范围 |
10 | 3 | 命令格式中字符/数据与指定的不同 |
10 | 4 | 命令格式错误 |
评论 (0)