Siemens S7
通过 S7comm 连接西门子 S7 PLC:机架和槽位、存储区、定型的字节/位寻址,以及那些原生数据类型。
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 点位是靠定型字段寻址的,不是靠一串自由文本。面板把它们放在点位的“来源”卡片里:
| 字段 | 含义 | 接受的取值 | 默认值 |
|---|---|---|---|
| 区域 | 要读的存储区。 | DataBlock、Merker、ProcessInput、ProcessOutput、Timer、Counter |
DataBlock |
| DB 号 | 哪一个数据块,只在“区域”是 DataBlock 时显示。 |
0 及以上 | 1 |
| 起始字节 | 值在这个区域里从哪个字节偏移开始。在 Timer 和 Counter 区域里,这个框改标为定时器号或计数器号,问的是那个定时器或计数器的编号。 |
0 及以上 | 0 |
| 位(0–7) | 起始字节里的位位置。只对布尔点位显示。 | 0–7 | 0 |
| 最大长度(留空 = 254) | 一个 S7 STRING 声明的最大长度。只对 Timer 和 Counter 之外的文本点位显示。 |
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 拒绝的一个地址不会造成这种局面,所以一个打错的点位绝不会把这台设备其余部分一起拖垮。