JAVA与西门子S7协议通讯

1.引入maven依赖

  <!--S7协议(与西门子通信依赖)-->
        <dependency>
            <groupId>com.github.s7connector</groupId>
            <artifactId>s7connector</artifactId>
            <version>2.1</version>
        </dependency>

2.工具类

package com.nwpusct.csal.controller.s7plc;

import com.github.s7connector.api.DaveArea;
import com.github.s7connector.api.S7Connector;
import com.github.s7connector.api.S7Serializer;
import com.github.s7connector.api.factory.S7ConnectorFactory;
import com.github.s7connector.api.factory.S7SerializerFactory;

import java.io.IOException;
import java.math.BigInteger;
import java.nio.ByteBuffer;

/**
 * 测试PLC通信,使用
 */
public class S7Utlis {
    public static S7Connector initConnect(String ipAddress) {
        S7Connector s7connector = null;
        try {
            //PLC地址 ipAddress
            //默认端口
            int port = 102;
            int rack = 0;
            int slot = 1;
            int timeout = 10000;
            s7connector =
                    S7ConnectorFactory
                            .buildTCPConnector()
                            .withHost(ipAddress)
                            .withPort(port) //optional
                            .withRack(rack) //架机号  可选
                            .withSlot(slot) //插槽号  可选
                            .withTimeout(timeout) //连接超时时间
                            .build();
            S7Serializer s7Serializer2L = S7SerializerFactory.buildSerializer(s7connector);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return s7connector;
    }

    /**
     * 读取PLC中的整型数据
     **/
    public static int readPlcIntData(S7Connector s7Connector, int db, int dataLength, int offset) {
        //第一个参数:DaveArea.DB 表示读取PLC的地址区域为DB
        //第二个参数:DB块地址,若plc中是DB1000,则填1000
        //第三个参数:数据长度
        //第四个参数:偏移量
//        byte[] getBytes = s7Connector.read(DaveArea.DB, 150, 2, 0);
        byte[] getBytes = s7Connector.read(DaveArea.DB, db, dataLength, offset);
        Integer intData = new BigInteger(getBytes).intValue();
        System.out.println("getIntData:" + intData);
        try {
            s7Connector.close();
            return intData;
        } catch (IOException e) {
            e.printStackTrace();
            return -1;
        }
    }

    /**
     * 向PLC中写短整型(2字节,对应PLC INT类型)数据
     **/
    public static void writePlcShortIntData(int bytesL, S7Connector s7Connector, int db, int offset, short data) {

        //第一个参数:DaveArea.DB 表示读取PLC的地址区域为DB
        //第二个参数:DB块地址,若plc中是DB1000,则填1000
        //第三个参数:偏移量
        //第四个参数:写入的数据 二进制数组byte[]
        byte[] bytes = ByteBuffer.allocate(bytesL).putShort(data).array();
        System.out.println("bytes length:" + bytes.length);
        s7Connector.write(DaveArea.DB, db, offset, bytes);
        try {
            s7Connector.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


3.API接口

package com.nwpusct.csal.controller.s7plc;

import com.github.s7connector.api.S7Connector;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;




@CrossOrigin
@RestController
@Api(tags = {"PLC接口信息"})
@RequestMapping(value = "/plcApi")
public class S7TcpController {

    @Value(value = "${plc-ip}")
    private String plcIP;

    @GetMapping(value = "/readPlcIntData")
    public String readPlcIntData( @RequestParam(value = "db") Integer db,
                                  @RequestParam(value = "dataLength") Integer dataLength,
                                  @RequestParam(value = "offset") Integer offset
    ) {
        try {
            S7Connector s7Connector = S7Utlis.initConnect(plcIP);
            System.out.println("readPlcIntData------连接成功");
            int i = S7Utlis.readPlcIntData(s7Connector,db,dataLength,offset);
            return String.valueOf(i);
        } catch (Exception e) {
            e.printStackTrace();
            return "读取失败!!!";
        }
    }

    @GetMapping(value = "/writePlcIntData")
    public String writePlcIntData(@RequestParam(value = "bytesL") Integer bytesL,
                                  @RequestParam(value = "db") Integer db,
                                  @RequestParam(value = "offset") Integer offset,
                                  @RequestParam(value = "data") short data
    ) {
        try {
            S7Connector s7Connector = S7Utlis.initConnect(plcIP);
            System.out.println("writePlcIntData-----连接成功");
            S7Utlis.writePlcShortIntData(bytesL,s7Connector, db, offset, data);
            return "写入成功!!!";
        } catch (Exception e) {
            e.printStackTrace();
            return "写入失败!!!";
        }
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 西门子S7协议是德国西门子公司专为其S7系列可编程逻辑控制器(PLC)设备开发的一种通信协议。该协议用于实现PLC与上位机或其他设备之间的数据交换和控制命令传输。 Java是一种高级编程语言,具有跨平台、面向对象、易学易用等特点。Java语言拥有丰富的类库和API,可以方便地与各种硬件设备进行通信和交互。 针对西门子S7协议Java开发,可以利用Java的网络编程能力,在与PLC建立网络连接后,采用S7协议进行数据传输和控制命令的发送与接收。Java中可以使用socket编程或使用第三方库来实现与PLC之间的通信,例如使用Java Socket类进行TCP/IP通信或使用Apache MINA等框架进行底层通信的封装。 在开发过程中,需要根据S7协议的规范和西门子提供的文档,了解S7协议的数据传输格式、通信建立过程、命令的编码与解码等细节。根据这些规范,使用Java编写相应的代码实现与PLC的通信,包括建立连接、读写数据、发送控制命令等操作。 总之,利用Java编程语言可以方便地实现对西门子S7协议的支持和应用开发,以实现PLC与上位机或其他设备之间的数据交换和控制命令传输。使用Java开发可以充分发挥其跨平台和强大的编程特性,提高开发效率和可移植性。 ### 回答2: 西门子S7协议是指用于西门子可编程逻辑控制器(PLC)的通信协议。它允许外部设备(如计算机或其他PLC)与S7系列PLC进行通信,实现数据传输和远程控制。而Java是一种面向对象的编程语言,具有跨平台、易于学习和使用等特点。 在使用Java进行西门子S7协议通信时,可以使用Java提供的Socket编程来实现与PLC之间的通信。Java的Socket类库提供了TCP/IP协议的支持,而西门子S7协议使用的就是TCP/IP协议进行通信。 首先,需要创建一个Socket对象连接到PLC的IP地址和端口号。然后,通过Socket对象的输入输出流发送和接收数据。使用西门子S7协议的命令格式来发送读写操作请求,以读取和写入PLC的数据。当收到PLC的响应后,可以解析响应数据并进行相应的处理。 除此之外,也可以使用Java相关的开源库,如Snap7,来简化与西门子S7协议通信的过程。Snap7是一个用C++编写的开源库,提供了用于连接和通信PLC的API接口。可以使用Java的JNI技术调用C++代码,在Java程序中使用Snap7库实现与PLC的通信。 总之,使用Java进行西门子S7协议通信需要借助Java的Socket编程或者结合开源库等方法来实现。这样可以实现与PLC的数据传输和远程控制,从而实现自动化控制系统中的各种功能。 ### 回答3: 西门子S7协议西门子工业自动化领域中的一种通信协议,用于与S7系列PLC(可编程逻辑控制器)进行通信。该协议基于TCP/IP协议栈,可以在局域网或互联网上进行数据传输。 Java是一种面向对象编程语言,具有良好的跨平台性和易学性,在开发网络应用程序方面被广泛使用。 结合S7协议Java,可以利用Java编写程序与S7 PLC进行通信和控制。首先,需要使用Java网络编程库建立与PLC的通信连接,可以使用Socket类建立TCP/IP连接。然后,通过S7协议的相关命令和指令,发送数据请求和接收响应,实现对PLC的监控和控制。 在Java中,可以使用第三方库如Snap7来实现与S7 PLC的通信。该库提供了一系列的Java API(应用程序接口),可以简化与PLC的通信操作。通过这些API,可以轻松地读取和写入PLC的存储器区域,获取实时数据,并发送控制指令。 通过Java编程和S7协议,可以实现远程监控和远程控制PLC系统。例如,可以监控PLC中各个传感器的数据并进行实时显示,或者发送指令控制各个执行器的运行状态。这为工业自动化系统的远程管理和监控提供了便利。 总之,利用Java编程和S7协议,可以实现与S7 PLC的通信和控制,达到远程监控和控制的目的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值