【2023】JAVA和PLC实现通讯读取写入数据,以三菱PLC举例

这篇具有很好参考价值的文章主要介绍了【2023】JAVA和PLC实现通讯读取写入数据,以三菱PLC举例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、创建maven工程引入依赖

        <!-- https://mvnrepository.com/artifact/com.github.dathlin/HslCommunication -->
        <dependency>
            <groupId>com.github.dathlin</groupId>
            <artifactId>HslCommunication</artifactId>
            <version>3.3.1</version>
        </dependency>

进行PLC连接需要了解两个概念:长连接和短连接。为了更好的说明当前的通信情况,我把所有的通信拆分为四个部分,连接,发,收,断开。

  • 短连接:连接,发,收,断开,连接,发,收,断开,连接,发,收,断开,连接,发,收,断开…无限循环
  • 长连接:连接,发,收,发,收,发,收,发,收,发,收,发,收,发,收,发,收,发,收…断开

然后我们来看看异常的情况,短连接的异常比较好处理,反正每次请求都是先连接,关键来看长连接的异常
长连接:连接,发,收,发,收…异常,连接,发,收,发,收,异常,连接,连接,连接…收,发,收,发,收,发,收,发,收…断开
这里第一个异常发生后,第二次读写立即连接上去并且成功,第二个异常触发后,一直读写失败,说明就是一直连接不上去。
对于HSL组件来说,不需要重复连接服务器或是plc,无论是短连接还是长连接,都只需要一直读写就OK了,对读写的结果进行判定,即使发生异常了,读写失败了,也要一直坚持,网络好的时候,读写会恢复成功的。

2、通过代码进行连接通讯

  • 实现短连接
// 实例化对象,指定PLC的ip地址和端口号
MelsecMcNet melsecMc = new MelsecMcNet( "192.168.1.110", 6000 );
// 举例读取D100的值
short D100 = melsecMc.ReadInt16( "D100" ).Content;
  • 实现长连接
// 实例化对象,指定PLC的ip地址和端口号
MelsecMcNet melsecMc = new MelsecMcNet( "192.168.1.110", 6000 );
// 如果网络不太理想,配置了两个端口,一个有问题,立即切换另一个的话,可以配置如下的代码
// melsecMc.GetPipeSocket( ).SetMultiPorts( new int[] { 6000, 6001 } );

// 连接对象
OperateResult connect = melsecMc.ConnectServer( );
if (!connect.IsSuccess)    //用于判断是否连接成功,返回true/false
{
    Console.WriteLine( "connect failed:" + connect.Message );
    return;
}

// 举例读取D100的值
short D100 = melsecMc.ReadInt16( "D100" ).Content;

// 实际上所有的读写都是返回是否成功的标记的,在实际的开发中,需要严格的判定,怎么判定呢?如下的代码
OperateResult<short> readD100 = melsecMc.ReadInt16( "D100" );
if (readD100.IsSuccess)
{
    // 读取成功,这时候获取Content才是正确的值
    short value = readD100.Content;
}
else
{
    // 读取失败,如果仍然坚持去获取Content的值,就为0
}

// 读写是否成功的情况,应用于几乎所有的读写代码,只要看清楚返回的数据类型即可
melsecMc.ConnectClose( );

3、基本的读取示例

MelsecMcNet melsec_net = new MelsecMcNet( "192.168.0.100", 6000 );
melsec_net.SetPersistentConnection( );                                           // 设置长连接的操作

// 此处以D寄存器作为示例,此处没有判断是否读写成功,所以是有风险的,如果通讯失败,所有的值都不是正确的
short short_D1000 = melsec_net.ReadInt16( "D1000" ).Content;                     // 读取D1000的short值 
ushort ushort_D1000 = melsec_net.ReadUInt16( "D1000" ).Content;                  // 读取D1000的ushort值
int int_D1000 = melsec_net.ReadInt32( "D1000" ).Content;                         // 读取D1000-D1001组成的int数据
uint uint_D1000 = melsec_net.ReadUInt32( "D1000" ).Content;                      // 读取D1000-D1001组成的uint数据
float float_D1000 = melsec_net.ReadFloat( "D1000" ).Content;                     // 读取D1000-D1001组成的float数据
long long_D1000 = melsec_net.ReadInt64( "D1000" ).Content;                       // 读取D1000-D1003组成的long数据
ulong ulong_D1000 = melsec_net.ReadUInt64( "D1000" ).Content;                    // 读取D1000-D1003组成的long数据
double double_D1000 = melsec_net.ReadDouble( "D1000" ).Content;                  // 读取D1000-D1003组成的double数据
string str_D1000 = melsec_net.ReadString( "D1000", 10 ).Content;                 // 读取D1000-D1009组成的条码数据

// 读取数组
short[] short_D1000_array = melsec_net.ReadInt16( "D1000", 10 ).Content;         // 读取D1000的short值 
ushort[] ushort_D1000_array = melsec_net.ReadUInt16( "D1000", 10 ).Content;      // 读取D1000的ushort值
int[] int_D1000_array = melsec_net.ReadInt32( "D1000", 10 ).Content;             // 读取D1000-D1001组成的int数据
uint[] uint_D1000_array = melsec_net.ReadUInt32( "D1000", 10 ).Content;          // 读取D1000-D1001组成的uint数据
float[] float_D1000_array = melsec_net.ReadFloat( "D1000", 10 ).Content;         // 读取D1000-D1001组成的float数据
long[] long_D1000_array = melsec_net.ReadInt64( "D1000", 10 ).Content;           // 读取D1000-D1003组成的long数据
ulong[] ulong_D1000_array = melsec_net.ReadUInt64( "D1000", 10 ).Content;        // 读取D1000-D1003组成的long数据
double[] double_D1000_array = melsec_net.ReadDouble( "D1000", 10 ).Content;      // 读取D1000-D1003组成的double数据

4、具体的详细读取demo

常用方法

  • setNetworkNumber() :设置网络号
  • ConnectServer():把连接由短连接切换为长连接,需要断开重新连接
  • SetPersistentConnection():设置长连接的操作,不需要断开重新连接
  • IsSuccess :判断是否连接成功
  • read 开头的方法都为读取方法,
  • write 开头的方法都为写入的方法
public class MelsenMcClent {

    private MelsecMcNet clent;
    private String ip;
    private int port;

    /**
     * 初始化连接对象
     * @author zhengfuping
     * @date 2023/1/9 8:07
     * @version 1.0
     */
    public boolean iniConnet(String ip,int port){
        clent = new MelsecMcNet(ip, port);
        this.ip = ip;
        this.port = port;
        clent.setNetworkStationNumber((byte) 0x00);
        clent.setSleepTime(10);
        OperateResult connet = clent.ConnectServer();
        return connet.IsSuccess;
    }
    /**
     * @description: TODO 重试连接
     * @author zhengfuping
     * @date 2023/1/9 8:07
     * @version 1.0
     */
    public boolean restartConnet(){
        OperateResult connet = clent.ConnectServer();
        if(connet != null && connet.IsSuccess){
            return true;
        }else{
            clent = new MelsecMcNet(this.ip, this.port);
            clent.setNetworkStationNumber((byte) 0x00);
            clent.setSleepTime(10);
            connet = clent.ConnectServer();
            return connet.IsSuccess;
        }
    }

    /**
     * 读取字符串
     * */
    public String read(String address,int length){
        OperateResultExOne<String> result = clent.ReadString(address,(short)length);
        return result.Content.trim();
    }
    /**
     * 读取32位数字
     * */
    public Integer readInt32(String address){
        OperateResultExOne<Integer> result = clent.ReadInt32(address);
        return result.Content;
    }
    /**
     * 读取16位数字
     * */
    public Short readInt16(String address){
        OperateResultExOne<Short> result = clent.ReadInt16(address);
        return result.Content;
    }
    /**
     * 读取浮点数
     * */
    public Float readFloat(String address){
        OperateResultExOne<Float> result = clent.ReadFloat(address);
        return result.Content;
    }

    /**
     * 写入字符串
     * */
    public boolean write(String address,String dataVal){
        OperateResult result = clent.Write(address, dataVal);
        return result.IsSuccess;
    }
    /**
     * 写入数字
     * */
    public boolean write(String address,short dataVal){
        OperateResult result = clent.Write(address, dataVal);
        return result.IsSuccess;
    }

//下面的或者工具类对象可以自己根据业务情况设置,一般三菱PLC是一个端口只能有一个客户端去连接
  /**
     * 创建单例
     * */
    private static class Interior{
        private static MelsenMcClent CLENT = new MelsenMcClent();

        public static MelsenMcClent getConnect(String state){
            MelsenMcClent writeClent;
            if (state.equals("Write")){
                writeClent = getWriteClent();
            }else if (state.equals("Read")){
                writeClent = getReadClent();
            }else {
                writeClent = null;
            }
            return writeClent;
        }

        /**
         * 写入对象
         * */
        private static MelsenMcClent getWriteClent(){
            MelsenMcClent writeClent=Interior.CLENT;
            writeClent.iniConnet("192.168.120.158", 4000);
            return writeClent;
        }
        /**读取对象*/
        private static MelsenMcClent getReadClent(){
            MelsenMcClent readClent=Interior.CLENT;
            readClent.iniConnet("192.168.120.158", 4001);
            return readClent;
        }
    }

    /**
     * 返回连接工具对象(因为我这边需要读取写入分开,所以设置为两个,可以不设置)
     * @param state 读取/写入状态
     * @return MelsenMcClent
     */
    public static MelsenMcClent getConnect(String state){
        return Interior.getConnect(state);
    }

###具体调用读取和写入的代码如下
因为我本地没有连接PLC就不粘贴日志的输出结果了,可以使用下面的软件进行配合测试
plc java,IO通讯,java,驱动开发,硬件架构,计算机网络

使用软件进行测试

1、写入值:

plc java,IO通讯,java,驱动开发,硬件架构,计算机网络

2、读取值

刚刚写入的值
plc java,IO通讯,java,驱动开发,硬件架构,计算机网络

  • 软件名字叫HslCommunication,可以直接他家官网下载,具体页面如下,选择好PLC型号,然后输入IP和端口就可以连接测试了
    plc java,IO通讯,java,驱动开发,硬件架构,计算机网络

🔗一些同学说依赖有问题;我把我的发百度网盘上了,需要的可以自己拿

链接: https://pan.baidu.com/s/1NcpAVuzSqURhWs7wfUhMQg?pwd=rg12
提取码: rg12文章来源地址https://www.toymoban.com/news/detail-658140.html

到了这里,关于【2023】JAVA和PLC实现通讯读取写入数据,以三菱PLC举例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#上位机与三菱PLC的通信09---开发自己的通讯库(A-3E版)

       具体细节请看: C#上位机与三菱PLC的通信05--MC协议之QnA-3E报文解析 C#上位机与三菱PLC的通信06--MC协议之QnA-3E报文测试  前面开发了自己的A-1E协议的通讯库,实现了数据的读写,对于封装的通讯库,其实是一个dll文件,请看上节的dll文件,有了这个文件,就可以在项目中直

    2024年02月22日
    浏览(27)
  • 三菱plc数据寄存器D

    在输入和输出处理、模拟控制和位置控制期间,需要许多数据寄存器来存储数据和参数。数据寄存器为16位,最高位为符号位。两个数据寄存器可以组合存储32位数据,最高位仍然是符号位。   数据寄存器分为以下几类: 通用数据寄存器D0 ~ D199有200个点。 断电/锁存寄存器D20

    2024年02月08日
    浏览(32)
  • Apache POI实现Excel导入读取数据和写入数据并导出

    Apache POI POI介绍 Apache POI是用Java编写的免费开源的跨平台的Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能,其中使用最多的就是使用POI操作Excel文件。 maven坐标: POI结构: 入门案例 ExcelTest .java文件 从Excel文件读取数据

    2024年02月12日
    浏览(32)
  • Java实现读取转码写入ES构建检索PDF等文档全栈流程

    之前已简单使用ES及Kibana和在线转Base64工具实现了检索文档的demo,并已实现WebHook的搭建和触发流程接口。 传送门: 基于GitBucket的Hook构建ES检索PDF等文档全栈方案 使用ES检索PDF、word等文档快速开始 总体思路:基于前面已经搭建的WebHook触发流程,接收到push更新消息之后,使用

    2024年03月10日
    浏览(50)
  • 三菱PLC 流水灯控制

    方式一思路:每一秒让计数器 C0 的值加一,然后将 C0 对应的值赋值给输出灯 Y10 - Y15。 方式二思路:每一秒让寄存器 D0 的值向左移1位,然后使用组合位元件将 D0 的低八位值传送给输出灯 Y10 - Y17。    后面有更好的思路再来增加。

    2024年02月16日
    浏览(61)
  • 上位机开发之三菱PLC通信

    三菱MC协议是开发三菱系列PLC必须掌握的一种通信协议,其目的是让外部设备,可以通过串行通信模块C24或以太网接口模块E71,实现对可编程控制器CPU的数据访问。 MC协议是Melsec协议的简称。 外部设备通过C24/E71访问可编程控制器CPU时,可以选择不同的通信帧及数据格式来实现

    2023年04月08日
    浏览(29)
  • 【工控老马】三菱Q系列PLC调试及三菱触摸屏报警使用说明详解

    一 程序段注解 第1步 编辑菜单→文档创建→声明编辑 第2步 在左侧空白处双击→弹出行间声明输入弹窗→输入申明内容 第3步 显示如图,转换+全部编译 二 插入比较指令 第1步 编辑菜单→梯形图编辑模式→写入模式 第2步 在需要插入指令的地方双击→输入指令内容 第3步 显示

    2024年02月05日
    浏览(53)
  • C# 三菱PLC上位机开发环境搭建

    一、安装软件 用到两个三菱的软件: 1. MX Component(下载地址 也可以直接在官网上搜索,注意MX后面有空格) 用于连接PLC 2. GX Works2(下载地址 用GX Works3也行) 这个软件主要是电气做PLC编程,我们用来作为仿真,省去开发时摆弄真实PLC 序列号:117-570766844 二、配置软件 MX

    2023年04月18日
    浏览(35)
  • 【STM32L496】使用HAL库实现SPI写入/读取数据(AD5421)

    SPI协议详解(图文并茂+超详细) SPI超详细解析 【STM32笔记】HAL库中的SPI传输(可利用中断或DMA进行连续传输) AD5421是一款集成器件,设计用于环路供电型4-20mA智能发射器应用。AD5421在单芯片内提供如下特性和功能:16位DAC和电流放大器,用于对环路电流进行数字控制;用于

    2024年02月03日
    浏览(58)
  • PLC通信协议【三菱Q系列】MC协议

    MC协议的目的是开放PLC内部寄存器给外部设备,实现外部设备和PLC的数据交互。简单说就是允许外部设备通过MC协议来读/写PLC里面的寄存器 通讯方式有485和TCP/IP两种,本次只介绍TCP/IP下的配置和通讯方法,其实两者一样没啥大区别。 采用一发一收模式,外部设备主动发起通讯

    2024年02月07日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包