【西门子】JAVA链接S7-1200,S7-1500上下行数据处理

仿真环境

首先用到的软件有以下几个

安装TIA Portal

这个没什么特殊的一路下一步就行 (哦,有同事反应找个博图不好卸载。。建议虚拟机里装)

创建仿真项目

双击打开
双击打开这个软件,创建新的项目
在这里插入图片描述

在这里插入图片描述

创建PLC设备

在这里插入图片描述
添加新设备
在这里插入图片描述
按照自己需要的创建不同型号的PLC
在这里插入图片描述
在这里插入图片描述
点击添加。

配置网络信息

双击WLAN口,配置设备的网络信息
在这里插入图片描述
在这里插入图片描述
配置后如下图所示
在这里插入图片描述

放开PLC,PUT/GET权限

右键PLC设备,点击属性
在这里插入图片描述
在允许远程对象PUT/GET访问打上勾
在这里插入图片描述

设定程序块用来模拟取值

在这里插入图片描述
在这里插入图片描述
编号可以自动,也可以手动指定,这里跟后面程序访问时参数设定有关。
生成数据块之后右键点击数据块属性,在属性中设置关闭优化块访问
在这里插入图片描述

在这里插入图片描述
点击确定完成设置

添加项目完成数据块的设置
在这里插入图片描述
这里解释一下数据库名称
DBD0代表着偏移量0,数据类型时DInt,
DBW4代表着偏移量4,数据类型时Int

启动仿真

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
出现下面界面就算成功了,千万不要点击完成
在这里插入图片描述

解压缩NetToPLCsim

首先博图自带的仿真只是供开发时使用博图自己的调试程序调用的,java的链接工具是连不上的。所以需要NetToPLCsim。解压缩NetToPLCsim,这个运行时一定要使用管理员,他需要杀掉博图自带的102端口服务,然后替换成自己的,不使用管理员打开无法杀掉对应程序。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
主机地址不用手输,可以选择,选择自己的网卡IP
在这里插入图片描述
PLC仿真的IP,第一次打开可能无法访问到,会提示下面的错误
在这里插入图片描述
这个时候需要在仿真程序的小画面上模拟开机
先点击电源键
在这里插入图片描述
在这里插入图片描述
然后再点击电源键,这个时候就不再是未组态的PLC了,点击RUN启动PLC仿真的电源
在这里插入图片描述
一阵闪烁后会变为绿色
在这里插入图片描述
这个时候再选择就会有候选地址了
在这里插入图片描述
按照程序提示,设置插槽号和架机号,S7-1200/1500得设置成0/1
在这里插入图片描述
点击OK完成添加,成功后如下图所示
在这里插入图片描述
点击Start Server开启服务,就可以通过JAVA程序访问S7仿真了。

JAVA操作S7

S7链接工具类

使用S7Connector

        <dependency>
            <groupId>com.github.s7connector</groupId>
            <artifactId>s7connector</artifactId>
            <version>2.1</version>
        </dependency>

JAVA读取DB块

以读取我上面间的DBD0为例

S7Connector connector =
                S7ConnectorFactory
                    .buildTCPConnector()
                    .withPort(102) // 端口号,默认是102
                    .withHost("你主机的IP") 
                    .withRack(0) //架机号
                    .withSlot(1) //插槽号
                    .build();

byte[] plcData = connector.read(
            DaveArea.DB, //选择区块
            200, // 区块编号,比如我上面建的是200
            4,  // 长度,跟你区块中建的变量有关
            0);   // 开始位置,跟你区块中建的变量有关

S7Serializable converter = new LongConverter();
Long data = converter.extract(Long.class, plcData, 0, 0);
System.out.println(data);

执行结果如下
在这里插入图片描述
你可以在仿真里修改一下初始值尝试一下。这里附赠一下写的工具类

public class PlcUtils {

    private static Map<Class, S7Serializable> s7SerializableMap = new HashMap<>();

    static {
        s7SerializableMap.put(Integer.class, new IntegerConverter());
        s7SerializableMap.put(Long.class, new LongConverter());
        s7SerializableMap.put(Float.class, new RealConverter());
    }

    /**
     * PLC 数据读取
     * @param <T> targetClass 转换类型
     * @param connector PLC链接
     * @param db DB区块
     * @param length 数据长度
     * @param offset 数据开始位置
     * @return PLC数据
     */
    public static <T> T read(Class<T> targetClass, S7Connector connector, Integer db, Integer length, Integer offset) {

        byte[] plcData = connector.read(
            DaveArea.DB, //选择区块
            db, // 区块编号
            length,  //长度
            offset);   //开始位置

        if (targetClass == String.class) {
            return (T) new String(plcData);
        }
        S7Serializable converter = s7SerializableMap.get(targetClass);
        return converter.extract(targetClass, plcData, 0, 0);
    }

    /**
     * 数据写入
     *
     * @param value 写入数据
     * @param connector PLC链接
     * @param db DB区块
     * @param length 长度
     * @param offset 数据开始位置
     */
    public static void write(Object value, S7Connector connector, Integer db, Integer length, Integer offset) {

        S7Serializable converter = s7SerializableMap.get(value.getClass());
        byte[] buffer = new byte[length];
        converter.insert(value, buffer, 0, 0, length);
        connector.write(DaveArea.DB, db, offset, buffer);
    }
}

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

加班狂魔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值