西门子的S7 协议,没有仍何关于S7协议的官方文档,是一个不透明的协议。关于S7的协议介绍,大都是非官方的一些七零八落的文档。
1. S7的通信模型
西蒙子S7 通讯遵从着基于TCP 的 Master(client) & Slave(Server)的通信模型。Master发送请求,用于从设备查询或向设备发送数据,或发出某些命令。
S7 协议的报文格式组成如下:
TPKT 是基于 ISO over TCP其被定义在RFC1006。ISO-COTP是在基于ISO8073协议(RFC905)的RFC2126中定义的。
S7协议是面向功能的或面向命令的。这意味着S7的传输由 请求(request) 和 回应(response) 组成(只有极少数例外)。
并行传输的数量和PDU的最大长度是在连接建立期间协商的。
S7 PDU 由以下内容构成:
项目 | 描述 |
---|---|
Header | 包含长度信息、PDU引用和消息类型常量 |
Parameters | 参数 |
Parameters Data | 参数数据 |
Data | 数据 |
例如, 将该数据从偏移量4开始写入DB10, Write DB 10 4和数据是命令的组成部分,并根据协议规范在消息中进行格式化。
在S400系列中,实现了所谓的循环数据I/O功能,这类似于传统的发布者-订户模型。PC可以订阅某些事件,而PLC会定期将请求的数据推送到网络。
S7 的命令主要分为以下几种:
- Data Read/Write
- Cyclic Data Read/Write
- Directory info
- System Info
- Blocks move
- PLC Control
- Security
- Programming
1.1 S7 通信的三种角色
- Client
发起请求 - Server
回应请求 - Partner
即是client 又是server。
作为Partner 的例子如下:
2. S7 的数据编址模型
S7 的数据读/写操作,是通过指定变量的内存区域,地址(offset),和Size或者类型来实现的。
PLC的数据 存储区域 类型如下:
数据存储区域 | 标号 | 描述 |
---|---|---|
Merker | [M] | 标记变量&寄存器标志 |
Data Block | [DB] | 数据块,DB区域是存储设备不同功能所需数据的最常见位置,这些数据块被编号为地址的一部分 |
Input | [I] | 输入点, 数字和模拟输入模块值,被映射到存储器中 |
Output | [Q] | 输出点, 类似内存映射的输出 |
Counter | [C] | PLC程序使用的不同计数器的值 |
Timer | [T] | PLC程序使用的不同计时器的值 |
每一种数据存储区域类型,都可以存储一个bit, byte,word(16bit),双word(32bit)。
关于以上内存区域存储的数据类型描述,我们来举个例子。 例如 IB0 表示一个输入byte的数据,起始地址为0, 其包含IB0.0 ~ IB0.7 八个位。
QB0 表示 输出点 为一个byte,起始地址为0。
QW5 表示一个输出点,占16bit 位宽,起始地址为5。
QD5 表示一个输出点,占32bit 位宽,起始地址为5。
DB的存放数据类型:
DB1.DBX0.0 表示 DB1 中的一个位
DB1.DBB0 表示一个8bit
DB1.DBW0 表示一个16bit
DB1.DBD0 表示一个32bit
一个byte的连续内存应该是这样: QB0, QB1, QB2, QBN。
一个word 的连续内存区域应该是这样分配: QW0,QW2,QW4… (因为其占2个byte)
一个32bit的连续内存区域应该是这样分配: QD0,QD4,QD8 … (因为其占4个byte)
2.1 定时器
- 线圈型定时器
- 功能框定时器 (常用)
- TP 脉冲定时器, 触发端只需要一次,一旦记时,就无法中断。
- TON 接通延时,触发端要一直有电,才记时,否则不计时。
- TONR 保持型接通延时,触发端要一直有电,才记时,否则不会清0,保持记时。
- TOF 关断延时,下降沿触发