Siemens S7

通过 S7comm 连接西门子 S7 PLC:机架和槽位、存储区、定型的字节/位寻址,以及那些原生数据类型。

以 Markdown 查看

Siemens S7 驱动通过 S7comm 和西门子 S7 PLC 对话,也就是承载在 ISO-on-TCP 上的那个经典 Step 7 协议。它用的是绝对寻址,即存储区、数据块号、字节和位,所以不需要从工程项目里导出任何符号表就能工作。在 Connector 里的 Siemens S7 驱动下面添加一台设备,把下面这些字段填上;面板只显示这个协议用得到的那些字段。

连接

字段 含义 默认值
主机 CPU(或者挡在它前面的那块 CP 模块)的 IP 地址或主机名。
机架 / 槽位 CPU 的机架号和槽位号,按西门子硬件组态里配置的填。同一行上两个数字框:先机架,后槽位。 0 / 0
轮询间隔(毫秒) 整台设备的读取周期,供没有自己另作规定的点位使用。 1000

TCP 端口固定为 102(ISO-on-TCP),所以没有端口字段。设备标题栏显示拼好的端点,例如 s7://192.168.0.2:0:1(主机、机架、槽位)。

机架和槽位必须和硬件对上:S7-1200 和 S7-1500 的 CPU 在机架 0、槽位 0 或 1 上应答;典型的 S7-300 CPU 坐在机架 0、槽位 2;S7-400 的机架随组态而变。槽位填错会让连接失败,而不是读到错的数据。

每个点位都可以设自己的轮询间隔(毫秒);点位填 0 就退回设备的间隔。

寻址

S7 点位是靠定型字段寻址的,不是靠一串自由文本。面板把它们放在点位的“来源”卡片里:

字段 含义 接受的取值 默认值
区域 要读的存储区。 DataBlockMerkerProcessInputProcessOutputTimerCounter DataBlock
DB 号 哪一个数据块,只在“区域”是 DataBlock 时显示。 0 及以上 1
起始字节 值在这个区域里从哪个字节偏移开始。在 TimerCounter 区域里,这个框改标为定时器号计数器号,问的是那个定时器或计数器的编号。 0 及以上 0
位(0–7) 起始字节里的位位置。只对布尔点位显示。 0–7 0
最大长度(留空 = 254) 一个 S7 STRING 声明的最大长度。只对 TimerCounter 之外的文本点位显示。 1 及以上,或留空 留空

这些区域对应到西门子常用的记法:Merker 是标志位存储区(M),ProcessInput 是过程映像输入(I/E),ProcessOutput 是过程映像输出(Q/A),Timer/Counter 是 S7 的定时器和计数器区。定时器和计数器按编号寻址,不按字节:Timer 填编号 5 读的是 T5,Counter 填编号 3 读的是 C3。把经典的绝对地址翻过来是这样:

经典地址 数据类型 要填的字段
存着 REAL 的 DB5.DBD12 Float 区域 DataBlock,DB 号 5,起始字节 12
DB1.DBX3.4 Boolean 区域 DataBlock,DB 号 1,起始字节 3,位 4
存着 INT 的 DB2.DBW20 Int16 区域 DataBlock,DB 号 2,起始字节 20
MW10 Int16 区域 Merker,起始字节 10
M10.3 Boolean 区域 Merker,起始字节 10,位 3
IB2 Byte 区域 ProcessInput,起始字节 2
Q4.1 Boolean 区域 ProcessOutput,起始字节 4,位 1
T5 Int16 区域 Timer,定时器号 5
C3 Int16 区域 Counter,计数器号 3

布尔点位在总线上恰好读写一个位;它绝不会把周围那个字节重写一遍。其余每一种类型都从起始字节开始按字节寻址,宽度就是它数据类型的确切宽度。“来源”卡片里那行只读的来源地址(总线)会随着你编辑显示拼好的地址。

数据类型

点位的数据类型决定总线上那个 S7 原生类型。十三种 S7 原生宽度全都可用:

数据类型 S7 类型 总线上的大小
Boolean BOOL 1 位
SByte SINT 1 字节
Byte USINT 1 字节
Int16 INT 2 字节
UInt16 UINT 2 字节
Int32 DINT 4 字节
UInt32 UDINT 4 字节
Int64 LINT 8 字节
UInt64 ULINT 8 字节
Float REAL 4 字节
Double LREAL 8 字节
String STRING 最大长度 + 2 字节
DateTime DTL 12 字节

多字节的值自动采用 S7 原生的大端字节序;没有字节序选项,因为根本用不着。

文本点位读的是标准的 S7 STRING 布局:一个字节的声明最大长度,一个字节的当前长度,然后是 ASCII 字符。最大长度必须和块里的 STRING 声明对上(留空表示 S7 的最大值 254);驱动每次读传输的是最大长度 + 2 个字节。日期时间点位映射到 S7-1200/1500 系列的 DTL 结构(从年一直到纳秒);较老的 8 字节 DATE_AND_TIME 不提供。

写入

访问方式为读写或只写的点位可以被写。写入寻的是和读一样的区域、字节和位:布尔写入置它那一个位,其余一切都写它类型确切的那些字节。新点位一开始是只读。

设备发现

S7comm 没有广播式的设备发现,所以 Connector 不为这个驱动显示“发现设备”按钮。设备和它的点位请手工添加。

需要知道的事

  • 在 S7-1200/1500 的 CPU 上,S7comm 的绝对寻址需要在西门子项目里改两处设置:CPU 上的允许使用 PUT/GET 通信进行访问,以及你要寻址的每一个数据块上的优化的块访问关掉。优化过的 DB 没有字节偏移可以寻址。
  • 定时器和计数器区按编号寻址,不按字节偏移:那个框问的是定时器或计数器本身(T0、T1、T2 和 C0、C1、C2)。每个值是一个 16 位字,所以要配 Int16;更宽或更窄的数据类型会被拒绝,点位名写进诊断日志,而这台设备其他的点位照读不误。
  • 一台够不着的 PLC 在启动时不花什么代价:设备在后台一直重试,在连接接上之前它的点位读作质量不可用。
  • 设备上线之后被拔掉的线缆,在下一次读取时被发现:设备转为离线,它的点位转为质量不可用,等网络回来它自己重新连上。CPU 拒绝的一个地址不会造成这种局面,所以一个打错的点位绝不会把这台设备其余部分一起拖垮。