欢迎光临散文网 会员登陆 & 注册

手机、电脑远程控制PLC(S7协议与MQTT)

2023-05-02 16:04 作者:悲匠  | 我要投稿

前言:S7 协议是 SIEMENS S7 系列产品之间通讯使用的标准协议,本文用JAVA实现与PLC以及服务器通讯,实现远程控制,控制原理就是用JAVA去读写PLC数据块,然后结合MQTT协议与服务器通讯,可以实现对PLC的远程控制与数据采集。C#、python也可以实现与plc通讯,本文用JAVA

0x0软件

西门子1200PLC(用官方的仿真也行)、博图v15、eclipse、EMQX(MQTT服务器)、宝塔(服务器运维)、jdk、maven

1x0MQTT服务器搭建

MQTT服务器搭建

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即可实现大数据看板与工厂数字孪生构建数字化工厂



手机、电脑远程控制PLC(S7协议与MQTT)的评论 (共 条)

分享到微博请遵守国家法律