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 "写入失败!!!";
}
}
}