上位链路的命令与响应格式(RD、RDS、WR、WRS)
通过实例解读基恩士 KV 系列上位链路的命令写法与响应格式。内容包括分隔用的空格、软元件的写法、数据格式 .U/.S/.D/.L/.H 的位数、定时器与计数器的读取以及 32 位值的处理。
更新
上位链路的命令是一行文本:命令名、软元件、个数和数据之间用空格分隔。本文以手册中“以有符号 16 位读写 DM200 起的 3 个字”的例子,依次说明格式。
格式的基本规则
- 各项之间用1 个空格(0x20)分隔
- 软元件类型与编号连写(
DM200) - 数据格式紧跟在编号后面(
DM200.S) - 继电器的
R可以省略(RDS 100 4与RDS R100 4相同) - 软元件编号、个数和写入数据开头的 0 可以省略,正写入值的
+也可以省略
连续读取 RDS
这条命令以有符号 16 位读取 DM200〜DM202 共 3 个字。
RDS 命令 连续读取DM 软元件类型 200 编号 .S 数据格式 有符号 16 位3 个数 CR 结束符 RD 读取 1 点,RDS 按指定个数读取连续的点。响应中的值以空格分隔排列。
+15025 DM200 -25400 DM201 +00000 DM202 CR LF 结束符 数据格式与位数
加上数据格式即可指定值的读写方式。响应的位数由格式决定。
| 格式 | 含义 | 响应位数 | 范围 |
|---|---|---|---|
| 无 | 位 | 1 | 0 / 1 |
.U | 十进制 16 位无符号 | 5(补 0) | 00000〜65535 |
.S | 十进制 16 位有符号 | 6(带符号) | -32768〜+32767 |
.D | 十进制 32 位无符号 | 10 | 0000000000〜4294967295 |
.L | 十进制 32 位有符号 | 11(带符号) | -2147483648〜+2147483647 |
.H | 十六进制 16 位 | 4 | 0000〜FFFF |
使用 .S 和 .L 时,0 也会像 +00000 这样带符号返回。
省略格式时,各软元件有各自的默认格式。
- 位:R、B、MR、LR、CR、VB
.U:DM、EM、FM、ZF、W、TM、Z、CM、VM.D:T、TC、TS、C、CC、CS、CTH、CTC、AT
给位软元件(R、B、MR、LR、CR、VB)加上 .U 等格式,就能一次读写 16 位或 32 位。如果从通道开头以外的位(如 R002)开始指定,读取会跨到下一个通道。
连续写入 WRS
写入时,在个数之后以空格分隔排列数据。
WRS 命令 连续写入DM200.S 起始软元件 3 个数 +15025 数据 1 -05400 数据 2 200 数据 3 CR 结束符 写入成功后返回 OK。
OK 正常结束 CR LF 结束符 只写 1 点时不带个数,写成 WR DM200.S -100。用 WR 写入 T 和 C 时写入当前值,用 WS/WSS 写入时写入设定值。
定时器与计数器返回 3 个值
读取 T、C、CTC、CTH 时,每 1 点返回“触点、当前值、设定值”3 个值。触点为 0/1,当前值和设定值为指定的格式(默认 .D)。
RD T0
0,0000000010,0000000010手册的图中逗号与空格的写法混用,但在 KV-7500 实机上返回的是逗号分隔。只想读取当前值或设定值时,指定 TC/TS(计数器为 CC/CS)。
32 位的值使用 2 个字
.D 和 .L 把 2 个字当作 1 个值处理:指定的编号是低位字,下一个编号是高位字。例如 RD DM100.L 读取 DM100(低位)和 DM101(高位)。
继电器编号是“通道+2 位位编号”
R、MR、LR、CR 的编号是在十进制通道编号后加上 2 位位编号(00〜15)。
R100:通道 1 的位 00MR1015:通道 10 的位 15R199915:通道 1999 的位 15
位编号最大为 15,因此不存在 MR1016 这样的编号。
而 B、VB、W 的编号用十六进制书写(B7FF、W1A0 等)。其他软元件为十进制。
用 KcpX 怎么写
在 KcpX 中,用 Prefix 指定软元件类型,用字符串指定编号。数据格式由类型决定:short 为 .S,ushort 为 .U,int 为 .L,uint 为 .D。
// 与 RDS DM200.S 3 相同
short[] values = kcpx.BatchRead<short>(Prefix.DM, "200", 3);
// 与 WRS DM200.S 3 +15025 -05400 200 相同
kcpx.BatchWrite<short>(Prefix.DM, "200", [15025, -5400, 200]);
// T0 的触点、当前值和设定值
TimerCounterValue t0 = kcpx.ReadTimerCounter(Prefix.T, "0");下一篇文章介绍出错时返回的响应。
出处
- 基恩士 KV-EP21V/KV-8000(A)/KV-7500/KV-5500/KV-NC1EP 用户手册 EtherNet/IP 功能(日文版)第 8 章 p.8-17〜8-26, 8-37