西门子S7-1200的RS232串口与上位机通讯功能及程序实现如下:
一、核心功能
控制输出点
通过上位机发送指令控制PLC的输出点,例如控制50个气缸的启停。每个气缸对应一个输出点(如Q0.0、Q0.1等),上位机发送特定指令(如十六进制0x01表示启动气缸1)后,PLC解析指令并更新对应输出状态。接收报警信号
气缸的报警信号(如过载、限位触发)通过PLC的输入点(如I0.0、I0.1等)采集,并实时上传至上位机。例如,当气缸1触发报警时,PLC将输入点状态打包为数据帧(如0x01 0xFF表示气缸1报警)发送至上位机。双向数据交互
支持全双工通信,上位机可主动查询PLC状态,PLC也可主动推送报警信息,确保实时性。
二、硬件配置步骤
模块选择
S7-1200需配备CM 1241 RS232通信模块,支持全双工通信,波特率最高达115.2kbps。
若需扩展更多串口,可增加模块或使用信号板(如SB1221 RS232)。
物理连接
使用交叉线连接PLC的RS232接口与上位机的串口(若上位机无串口,需通过USB转RS232转换器)。
确保接线正确:PLC的TXD接上位机RXD,RXD接TXD,GND接地。
TIA Portal硬件组态
起始字符:如
0x02(STX)。结束字符:如
0x0D(CR)。波特率:与上位机一致(如9600bps)。
数据位:8位。
停止位:1位。
校验位:无(或根据设备要求设置)。
在TIA Portal中添加CM 1241模块,设置端口参数:
在端口组态中配置消息帧格式:
三、程序实现方法
1. 使用Receive_PTP指令(点对点通信)
功能:接收上位机发送的完整数据帧(自动识别起始/结束字符)。
步骤:
通过
NDR(新数据接收完成)触发解析逻辑。示例:若接收数据为
0x01 0x01,表示启动气缸1,则置位Q0.0。PORT:选择CM 1241的硬件标识符(如267)。BUFFER:指定接收数据存储区(如DB1.DBB0)。在TIA Portal中创建数据块(如
DB1),用于存储接收数据。调用
Receive_PTP指令:在程序中解析数据:
2. 使用Send_PTP指令(发送数据至上位机)
功能:将PLC状态或报警信息主动发送至上位机。
步骤:
PORT:同上。DATA:指定发送数据区。LEN:数据长度。在数据块中准备发送数据(如
DB1.DBB10存储气缸报警状态)。调用
Send_PTP指令:通过条件触发发送(如报警信号上升沿)。
3. 自由口通信(自定义协议)
适用场景:需与非标准设备通信时。
步骤:
发送:通过
XMT指令逐字节发送数据(如0x02 0x01 0x01 0x0D表示启动气缸1)。接收:通过
RCV指令接收数据,并在程序中解析起始/结束字符。在TIA Portal中禁用硬件组态中的消息帧配置(选择“无”)。
使用
XMT(发送)和RCV(接收)指令手动处理数据:
四、上位机程序开发(以C#为例)
csharpusing System.IO.Ports;public class SerialCommunication{ private SerialPort serialPort; public void Initialize(string portName, int baudRate) { serialPort = new SerialPort(portName, baudRate, Parity.None, 8, StopBits.One); serialPort.DataReceived += SerialPort_DataReceived; serialPort.Open(); } private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { byte[] buffer = new byte[serialPort.BytesToRead]; serialPort.Read(buffer, 0, buffer.Length); // 解析数据帧(示例:起始字符0x02,结束字符0x0D) if (buffer.Length >= 3 && buffer[0] == 0x02 && buffer[buffer.Length - 1] == 0x0D) { int cylinderNumber = buffer[1]; bool isAlarm = (buffer[2] == 0xFF); // 处理气缸控制或报警(如更新UI) Console.WriteLine($"气缸{cylinderNumber}: {(isAlarm ? "报警" : "正常")}"); } } public void SendCommand(int cylinderNumber, bool start) { byte[] command = new byte[] { 0x02, (byte)cylinderNumber, (byte)(start ? 0x01 : 0x00), 0x0D }; serialPort.Write(command, 0, command.Length); }}// 使用示例var comm = new SerialCommunication();comm.Initialize("COM3", 9600);comm.SendCommand(1, true); // 启动气缸1五、关键注意事项
通信参数一致性:确保PLC与上位机的波特率、数据位、停止位、校验位完全一致。
数据帧格式:明确起始/结束字符,避免数据错位(如接收缓冲区未清空导致数据粘连)。
错误处理:在程序中添加超时重发机制和异常捕获(如串口断开重连)。
调试工具:使用串口调试助手(如SSCOM)模拟上位机或PLC,验证通信逻辑。

