手机、电脑远程控制PLC(S7协议与MQTT)
前言:S7 协议是 SIEMENS S7 系列产品之间通讯使用的标准协议,本文用JAVA实现与PLC以及服务器通讯,实现远程控制,控制原理就是用JAVA去读写PLC数据块,然后结合MQTT协议与服务器通讯,可以实现对PLC的远程控制与数据采集。C#、python也可以实现与plc通讯,本文用JAVA
0x0软件
西门子1200PLC(用官方的仿真也行)、博图v15、eclipse、EMQX(MQTT服务器)、宝塔(服务器运维)、jdk、maven
1x0MQTT服务器搭建
2x0安装博图v15、仿真、nettoplcsim
保姆教程:https://blog.csdn.net/jjhghh/article/details/126491434#t0
nettoplcsim(有真机的不用安装,这个用来将仿真机的IP地址转换出来)
链接:https://pan.baidu.com/s/1Yvr69Jb0PVa13kaZQ9wSJA 提取码:31s2
3x0eclipse安装与配置maven
java环境配置:
https://blog.csdn.net/qq_38436214/article/details/105071088
eclipse安装:
https://blog.csdn.net/rothschild666/article/details/82914600
maven配置:
https://blog.csdn.net/qq_43663493/article/details/104663638
4x0创建博图项目
新建数据块

点击设备属性勾选允许来自远程对象的put/get通讯访问

右键数据块勾选掉优化块的访问

启动仿真将程序写入

打开nettoplcsim转换IP地址
点击add

点击和你同网段的地址

选择你仿真plc的地址一般都是192.168.0.1

点击开始

5x0JAVA端采集程序与通讯程序
新建maven项目

选择maven project

勾选最上面这个

按要求填写

添加POM依赖库
<dependencies>
<dependency>
<groupId>com.github.s7connector</groupId>
<artifactId>s7connector</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20211205</version>
</dependency>
</dependencies>

连接plc代码
public static S7Connector connector; // 初始化PLC连接对象
connector = S7ConnectorFactory.buildTCPConnector().withHost("192.168.8.98") // PLC 的 IP 地址
.withRack(0) // 架机号,可选
.withSlot(1) // 插槽号,可选
.build();
读取数据代码
byte[] PlcData = connector.read(DaveArea.DB, // 选择数据区块
1, // 区块编号
2, // 数据值长度 int长度2
0); // 开始位置 偏移量
int plcin = intCon.extract(new Integer(0).getClass(), PlcData, 0, 0);
System.out.println(plcin);
写入数据块代码
byte[] data = new byte[2];
int i = 0;//需要写入的值
ByteBuffer buffer = ByteBuffer.allocate(4).putInt(i);
data[0] = buffer.get(2);
data[1] = buffer.get(3);
connector.write(DaveArea.DB, 1, 0, data);
连接MQTT代码
public static String brokerUrl = "tcp://cxxxxxx:1883";//MQTT服务器地址
public static String clientId = "mqtt-subscriber";//连接ID,相当于备注
public static String topic = "top";//订阅的主题
MqttClient client = new MqttClient(brokerUrl, clientId);
client.setCallback(new postt());
client.connect();
client.subscribe(topic);
完整代码:
package ddd;
import java.nio.ByteBuffer;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import com.github.s7connector.api.DaveArea;
import com.github.s7connector.api.S7Connector;
import com.github.s7connector.api.factory.S7ConnectorFactory;
import org.json.JSONObject;
public class postt implements MqttCallback{
public static S7Connector connector; // 初始化PLC连接对象
public static String brokerUrl = "tcp://xxxxxxxxx:1883";//MQTT服务器地址
public static String clientId = "mqtt-subscriber";//连接ID,相当于备注
public static String topic = "top";//订阅的主题
public static void main(String[] args) throws MqttException {
// 连接到 PLC
connector = S7ConnectorFactory.buildTCPConnector().withHost("192.168.8.98") // PLC 的 IP 地址
.withRack(0) // 架机号,可选
.withSlot(1) // 插槽号,可选
.build();
//连接到 MQTT 服务器
MqttClient client = new MqttClient(brokerUrl, clientId);
client.setCallback(new postt());
client.connect();
client.subscribe(topic);
}
//PLC写入数据
public void readplc(int a,int b,int c) {
byte[] data = new byte[2];
int i = b;//需要写入的值
ByteBuffer buffer = ByteBuffer.allocate(4).putInt(i);
data[0] = buffer.get(2);
data[1] = buffer.get(3);
connector.write(DaveArea.DB, c, a, data);
}
//断连回调
public void connectionLost(Throwable throwable) {
System.out.println("连接丢失:" + throwable.getMessage());
}
//收到消息的回调
public void messageArrived(String topic, MqttMessage message) throws Exception {
System.out.println("收到消息订阅主题" + topic + ": " + new String(message.getPayload()));
JSONObject json = new JSONObject(new String(message.getPayload()));
int wen = json.getInt("wen");
System.out.print("解析成功:"+wen);
readplc(0,wen,1);//将值写入
}
//消息发送成功的回调
public void deliveryComplete(IMqttDeliveryToken token) {
}
}
打开在线的webmqtt测试工具,成功接收并解析到结果

测试成功写入plc,成功

最后:
通过MQTT结合S7可以实现Web端、微信小程序端、Android端、IOS端对PLC远程控制以及采集PLC数据,可以结合硬件mqtt网关,然后前端用charts和threejs即可实现大数据看板与工厂数字孪生构建数字化工厂