java与plc 西门子 通讯,进行读写操作 采用TCP 直接连接
0x0
- 阅读本文章你能会使用java与西门子plc 进行通信
- 所有环境都为仿真模拟环境,
- 本测试使用的是西门子plc(s7-1500)
- 软件为: 博图v16 plc仿真(s7-1500) idea
0x1
- 开始工作,首先搭建plc环境 在这里不解释请转移到 模拟环境文章(在写了 会更新的)
- IDEA 使用 Maven 你也可以吧集成到spring 或者boot, 做进一步操作
0x2
-
创建工程
-
导入maven 坐标
<dependencies> <dependency> <groupId>com.github.s7connector</groupId> <artifactId>s7connector</artifactId> <version>2.1</version> </dependency> </dependencies> -
使用的是 s7connector 官网有简单的案例 官网地址s7connector.github.io/s7connector…
-
github地址 github.com/s7connector…
0x3
开始代码
创建对象
S7Connector connector =
S7ConnectorFactory
.buildTCPConnector()
.withHost("ip") //
.withRack(0) //架机号 可选
.withSlot(0) //插槽号 可选
.build();
架机和插槽在博图软件可以看到,当然了你也可以不写
ip地址可以在接口中看到
在plc保护中一定要开始读写操作和 远程对象put get 访问 要不然读取不到
对了还要关机 优化数据块的优化要不然看不到偏移地址
数据块 - 右键属性 -属性 - 优化块的访问
0x4
开始读
首先开始读取 String 字符串读取
plc数据块
byte[] PlcData = connector.read(
DaveArea.DB, //选择区块
1, // 区块编号
50, //长度
4); //开始位置
String str = new String(PlcData);
String str1 = "";
System.out.println("读取到的数据="+str);
StringConverter converter = new StringConverter();
String extract1 = converter.extract(str1.getClass(), PlcData, 0, 0);
System.out.println("内置方法转换str="+extract1);
注意这里的长度和开始位置有一些复杂关系
如果不使用内置方法转换字符串那么 读取出来的结果直接转换的话前两个字符换乱码
两个解决方法
使用内置方法来转换字符串 内置方法传参 字节偏移参数0就好因为源码中有拼接如果拼接大于读取长度会下标异常 位偏移 根本没用这
如果plc 内数据长度是固定的 可以使用固定长度开始位置+2 比如上边的我偏移量为4 那么我就从6位置开始读取 源码下图其实也是截断后两位
源码图
其他类型都差不多,,注意类型转换就好了 ,方法有类型转换
0x5
写操作
String data = "qqqqqqqq111";
byte[] bytes = data.getBytes();
connector.write(DaveArea.DB,1,4,bytes);
写入操作就比较简单了
结束!
进阶
- 使用opc ua 通讯方式 读写西门子 (如果现场设备比较多品牌不一样的情况下但是数据需要汇总收集分析,就可以用opcua ) 在写了.
- 使用kepserver 进行opc 通讯 kep server 是一款很强大的软件可以跟设备通讯 也可以跟上位机通讯 在写了
- 等待下次更新
求求你关注公众在走吧
所有代码
import com.github.s7connector.api.DaveArea;
import com.github.s7connector.api.S7Connector;
import com.github.s7connector.api.factory.S7ConnectorFactory;
import com.github.s7connector.impl.serializer.converter.StringConverter;
import com.github.s7connector.impl.utils.S7Type;
import com.sun.org.apache.xpath.internal.objects.XString;
/**
* @Author Alkin
* @Date 2020/12/30 10:08
* @Version 1.0
*/
public class Test {
public static void main(String[] args) {
//创建一个链接对象
S7Connector connector =
S7ConnectorFactory
.buildTCPConnector()
.withHost("192.168.0.1") //
.withRack(0) //架机号 可选
.withSlot(1) //插槽号 可选
.build();
String data = "qqqqqqqq111";
byte[] bytes = data.getBytes();
System.out.println("bytes = " + bytes.length);
connector.write(DaveArea.DB,1,4,bytes);
byte[] PlcData = connector.read(
DaveArea.DB, //选择区块
1, // 区块编号
255, //长度
4); //偏移地址
String str = new String(PlcData);
String str1 = "";
System.out.println("读取到的数据="+str);
StringConverter converter = new StringConverter();
String extract1 = converter.extract(str1.getClass(), PlcData, 0, 0);
System.out.println("内置方法转换str="+extract1);
}
}