// LEARN · 上位链路入门

上位链路的命令与响应格式(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 结束符

数据格式与位数

加上数据格式即可指定值的读写方式。响应的位数由格式决定。

格式含义响应位数范围
无位10 / 1
.U十进制 16 位无符号5(补 0)00000〜65535
.S十进制 16 位有符号6(带符号)-32768〜+32767
.D十进制 32 位无符号100000000000〜4294967295
.L十进制 32 位有符号11(带符号)-2147483648〜+2147483647
.H十六进制 16 位40000〜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 的位 00
  • MR1015:通道 10 的位 15
  • R199915:通道 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