【Java】博图S7通讯仿真测试上位机连接

前言



最近一段时间到一个工厂跟人去学习调试 PLC 设备,其中有个场景就是手拿遥控器人工进行库位标定并写入数据库。这个工作本身可以通过边拿电脑边去标定库位但是不太安全也不太方便,因为在工厂里面你的头顶上面还随时都有一个起重机在工作,库位之间的间隙也比较小。这个时候我就产生了一个想法就是通过手机来进行库位标定,这篇文章就是来说明如何让手机通过局域网与 PLC 进行通信的方案。

前提


  • PLC 具有 S7 通讯能力
  • PLC、手机、上位机在同一网段

方案设计


上位机
Http
Http
S7
S7
服务器
手机
PLC

PLC 和 手机共同连接上位机的网络,那么两者就可以通过各自的协议来进行通信,本质上都是通过 TCP/IP 的方式。

软件


视频教程


因为我不太熟悉博图软件,所以找了一个相关视频看了看,确实解决了我遇到的一些问题。如果有遇到什么问题可以在评论区提问,看见了就会回答。

如果你连接不上 PLC,可以尝试把电脑的 WIFI 连接关掉,采用以太网 IP 地址进行配置。


PLC 代码

当 “DB_S7”.bool01 为 FALSE 时,程序段 2 中移位器 MOVE 将 100 赋值给 “DB_S7”.int01;

当 “DB_S7”.bool01 为 TRUE 时,程序段 1 中移位器 MOVE 将 10 赋值给 “DB_S7”.int01。

%DB1.DBX0.0 为 “DB_S7”.bool01 变量的地址区,在 Java 中 % 不用加就可以访问和修改 “DB_S7”.bool01 的值。

%DB1.DBW2 为 “DB_S7”.int01 变量的地址区,在 Java 中 % 不用加就可以访问和修改 “DB_S7”.int01 的值。

在这里插入图片描述
在这里插入图片描述

服务器代码


依赖项

pom.xml

<dependency>
    <groupId>com.github.dathlin</groupId>
    <artifactId>HslCommunication</artifactId>
    <version>3.1.1</version>
</dependency>

默认情况 “DB_S7”.bool01 为 FALSE,即程序段2会将 100 赋值给 “DB_S7”.int01,因此当访问http://192.168.2.153:8000/plcConnect 时 “DB_S7”.int01 的值为 100;当访问 http://192.168.2.153:8000/plcConnect10 时 “DB_S7”.int01 的值修改为 10,这是因为程序段1会将 10 赋值给 “DB_S7”.int01。之后访问 plcConnect 接口 “DB_S7”.int01 的值为 10,当然你可以在服务器添加逻辑代码来处理各种情况还是蛮好玩的。

在这里插入图片描述

读取

@GetMapping("plcConnect")
public String plcConnect(){
	// SiemensPLCS.S1500 代表 PLC 的型号
	// "169.254.7.208" 代表 PLC 的 IP 地址
    SiemensS7Net siemensTcpNet = new SiemensS7Net(
            SiemensPLCS.S1500,
            "169.254.7.208");
    // siemensTcpNet.Read() 方法是向 PLC 读取指定地址区的变量值
    // "DB1.DBW2" 代表变量的地址区
    OperateResultExOne<byte[]> read = siemensTcpNet.Read("DB1.DBW2", (short) 8);
    String result = null;
    if (read.IsSuccess) {
        byte[] content = read.Content;
        short no = siemensTcpNet.getByteTransform().TransInt16(content, 2);
        result = "content: \t" + Arrays.toString(content) + "\nno:\t" + no;
    }
    siemensTcpNet.ConnectClose();
    return result;
}

写入

@GetMapping("plcConnect10")
public String plcConnect10(){
	// SiemensPLCS.S1500 代表 PLC 的型号
	// "169.254.7.208" 代表 PLC 的 IP 地址
    SiemensS7Net siemensTcpNet = new SiemensS7Net(
            SiemensPLCS.S1500,
            "169.254.7.208");
    // siemensTcpNet.Write 方法是向 PLC 修改指定地址区的变量值
    // "DB1.DBX0.0" 代表变量的地址区
    OperateResult read = siemensTcpNet.Write("DB1.DBX0.0", true);
    String result = null;
    if (read.IsSuccess) {
        String content = read.Message;
        result = "content: \t" + content;
    }
    siemensTcpNet.ConnectClose();
    return result;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要通过S7连接读取博图程序的数组变量,需要先在博图程序中使用"OPC Server"组件来建立一个OPC服务器,然后在VB脚本中通过S7连接OPC服务器来读取博图程序中的数组变量。 以下是具体步骤: 1. 在博图程序中添加"OPC Server"组件,并配置好OPC服务器的参数,包括OPC服务器名称、端口号、用户名和密码等。 2. 在博图程序中定义一个数组变量,并将其注册到OPC服务器中。在"OPC Server"组件的属性面板中,选择"Register"选项卡,点击"Add"按钮,输入数组变量的名称和数据类型,然后点击"Apply"按钮保存设置。 3. 在VB脚本中使用S7连接OPC服务器,并读取博图程序中的数组变量。可以使用S7的OPC DA客户端组件来连接OPC服务器,然后使用OPC DA客户端组件的ReadItem方法来读取数组变量的值。 下面是VB脚本的示例代码: ``` Dim S7Client As New OPCAutomation.OPCServer Dim ItemValue As Object Dim ItemQuality As Object Dim ItemTimeStamp As Object Dim ItemResult As Integer '连接OPC服务器 S7Client.Connect("OPC.Server.Name") '读取数组变量的值 S7Client.OPCGroups.DefaultGroup.OPCItems.AddItem _ "ArrayVariableName", 1 S7Client.OPCGroups.DefaultGroup.OPCItems.DefaultIsActive = True S7Client.OPCGroups.DefaultGroup.OPCItems.DefaultSamplingRate = 100 S7Client.OPCGroups.DefaultGroup.OPCItems.Refresh _ OPCAutomation.OPCDataSource.OPCDevice, 1, ItemValue, _ ItemQuality, ItemTimeStamp '显示数组变量的值 MsgBox "ArrayVariableName: " & ItemValue(1) ``` 这里假设OPC服务器的名称为"OPC.Server.Name",要读取的数组变量的名称为"ArrayVariableName"。在实际使用时,需要根据实际情况修改这些参数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hjhcos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值