国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【2023】JAVA和PLC實現(xiàn)通訊讀取寫入數(shù)據(jù),以三菱PLC舉例

這篇具有很好參考價值的文章主要介紹了【2023】JAVA和PLC實現(xiàn)通訊讀取寫入數(shù)據(jù),以三菱PLC舉例。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1、創(chuàng)建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連接需要了解兩個概念:長連接和短連接。為了更好的說明當前的通信情況,我把所有的通信拆分為四個部分,連接,發(fā),收,斷開。

  • 短連接:連接,發(fā),收,斷開,連接,發(fā),收,斷開,連接,發(fā),收,斷開,連接,發(fā),收,斷開…無限循環(huán)
  • 長連接:連接,發(fā),收,發(fā),收,發(fā),收,發(fā),收,發(fā),收,發(fā),收,發(fā),收,發(fā),收,發(fā),收…斷開

然后我們來看看異常的情況,短連接的異常比較好處理,反正每次請求都是先連接,關(guān)鍵來看長連接的異常
長連接:連接,發(fā),收,發(fā),收…異常,連接,發(fā),收,發(fā),收,異常,連接,連接,連接…收,發(fā),收,發(fā),收,發(fā),收,發(fā),收…斷開
這里第一個異常發(fā)生后,第二次讀寫立即連接上去并且成功,第二個異常觸發(fā)后,一直讀寫失敗,說明就是一直連接不上去。
對于HSL組件來說,不需要重復(fù)連接服務(wù)器或是plc,無論是短連接還是長連接,都只需要一直讀寫就OK了,對讀寫的結(jié)果進行判定,即使發(fā)生異常了,讀寫失敗了,也要一直堅持,網(wǎng)絡(luò)好的時候,讀寫會恢復(fù)成功的。

2、通過代碼進行連接通訊

  • 實現(xiàn)短連接
// 實例化對象,指定PLC的ip地址和端口號
MelsecMcNet melsecMc = new MelsecMcNet( "192.168.1.110", 6000 );
// 舉例讀取D100的值
short D100 = melsecMc.ReadInt16( "D100" ).Content;
  • 實現(xiàn)長連接
// 實例化對象,指定PLC的ip地址和端口號
MelsecMcNet melsecMc = new MelsecMcNet( "192.168.1.110", 6000 );
// 如果網(wǎng)絡(luò)不太理想,配置了兩個端口,一個有問題,立即切換另一個的話,可以配置如下的代碼
// 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;

// 實際上所有的讀寫都是返回是否成功的標記的,在實際的開發(fā)中,需要嚴格的判定,怎么判定呢?如下的代碼
OperateResult<short> readD100 = melsecMc.ReadInt16( "D100" );
if (readD100.IsSuccess)
{
    // 讀取成功,這時候獲取Content才是正確的值
    short value = readD100.Content;
}
else
{
    // 讀取失敗,如果仍然堅持去獲取Content的值,就為0
}

// 讀寫是否成功的情況,應(yīng)用于幾乎所有的讀寫代碼,只要看清楚返回的數(shù)據(jù)類型即可
melsecMc.ConnectClose( );

3、基本的讀取示例

MelsecMcNet melsec_net = new MelsecMcNet( "192.168.0.100", 6000 );
melsec_net.SetPersistentConnection( );                                           // 設(shè)置長連接的操作

// 此處以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數(shù)據(jù)
uint uint_D1000 = melsec_net.ReadUInt32( "D1000" ).Content;                      // 讀取D1000-D1001組成的uint數(shù)據(jù)
float float_D1000 = melsec_net.ReadFloat( "D1000" ).Content;                     // 讀取D1000-D1001組成的float數(shù)據(jù)
long long_D1000 = melsec_net.ReadInt64( "D1000" ).Content;                       // 讀取D1000-D1003組成的long數(shù)據(jù)
ulong ulong_D1000 = melsec_net.ReadUInt64( "D1000" ).Content;                    // 讀取D1000-D1003組成的long數(shù)據(jù)
double double_D1000 = melsec_net.ReadDouble( "D1000" ).Content;                  // 讀取D1000-D1003組成的double數(shù)據(jù)
string str_D1000 = melsec_net.ReadString( "D1000", 10 ).Content;                 // 讀取D1000-D1009組成的條碼數(shù)據(jù)

// 讀取數(shù)組
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數(shù)據(jù)
uint[] uint_D1000_array = melsec_net.ReadUInt32( "D1000", 10 ).Content;          // 讀取D1000-D1001組成的uint數(shù)據(jù)
float[] float_D1000_array = melsec_net.ReadFloat( "D1000", 10 ).Content;         // 讀取D1000-D1001組成的float數(shù)據(jù)
long[] long_D1000_array = melsec_net.ReadInt64( "D1000", 10 ).Content;           // 讀取D1000-D1003組成的long數(shù)據(jù)
ulong[] ulong_D1000_array = melsec_net.ReadUInt64( "D1000", 10 ).Content;        // 讀取D1000-D1003組成的long數(shù)據(jù)
double[] double_D1000_array = melsec_net.ReadDouble( "D1000", 10 ).Content;      // 讀取D1000-D1003組成的double數(shù)據(jù)

4、具體的詳細讀取demo

常用方法

  • setNetworkNumber() :設(shè)置網(wǎng)絡(luò)號
  • ConnectServer():把連接由短連接切換為長連接,需要斷開重新連接
  • SetPersistentConnection():設(shè)置長連接的操作,不需要斷開重新連接
  • 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位數(shù)字
     * */
    public Integer readInt32(String address){
        OperateResultExOne<Integer> result = clent.ReadInt32(address);
        return result.Content;
    }
    /**
     * 讀取16位數(shù)字
     * */
    public Short readInt16(String address){
        OperateResultExOne<Short> result = clent.ReadInt16(address);
        return result.Content;
    }
    /**
     * 讀取浮點數(shù)
     * */
    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;
    }
    /**
     * 寫入數(shù)字
     * */
    public boolean write(String address,short dataVal){
        OperateResult result = clent.Write(address, dataVal);
        return result.IsSuccess;
    }

//下面的或者工具類對象可以自己根據(jù)業(yè)務(wù)情況設(shè)置,一般三菱PLC是一個端口只能有一個客戶端去連接
  /**
     * 創(chuàng)建單例
     * */
    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;
        }
    }

    /**
     * 返回連接工具對象(因為我這邊需要讀取寫入分開,所以設(shè)置為兩個,可以不設(shè)置)
     * @param state 讀取/寫入狀態(tài)
     * @return MelsenMcClent
     */
    public static MelsenMcClent getConnect(String state){
        return Interior.getConnect(state);
    }

###具體調(diào)用讀取和寫入的代碼如下
因為我本地沒有連接PLC就不粘貼日志的輸出結(jié)果了,可以使用下面的軟件進行配合測試
plc java,IO通訊,java,驅(qū)動開發(fā),硬件架構(gòu),計算機網(wǎng)絡(luò)

使用軟件進行測試

1、寫入值:

plc java,IO通訊,java,驅(qū)動開發(fā),硬件架構(gòu),計算機網(wǎng)絡(luò)

2、讀取值

剛剛寫入的值
plc java,IO通訊,java,驅(qū)動開發(fā),硬件架構(gòu),計算機網(wǎng)絡(luò)

  • 軟件名字叫HslCommunication,可以直接他家官網(wǎng)下載,具體頁面如下,選擇好PLC型號,然后輸入IP和端口就可以連接測試了
    plc java,IO通訊,java,驅(qū)動開發(fā),硬件架構(gòu),計算機網(wǎng)絡(luò)

??一些同學說依賴有問題;我把我的發(fā)百度網(wǎng)盤上了,需要的可以自己拿

鏈接: https://pan.baidu.com/s/1NcpAVuzSqURhWs7wfUhMQg?pwd=rg12
提取碼: rg12文章來源地址http://www.zghlxwxcb.cn/news/detail-658140.html

到了這里,關(guān)于【2023】JAVA和PLC實現(xiàn)通訊讀取寫入數(shù)據(jù),以三菱PLC舉例的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • C#上位機與三菱PLC的通信09---開發(fā)自己的通訊庫(A-3E版)

    C#上位機與三菱PLC的通信09---開發(fā)自己的通訊庫(A-3E版)

    ? ?具體細節(jié)請看: C#上位機與三菱PLC的通信05--MC協(xié)議之QnA-3E報文解析 C#上位機與三菱PLC的通信06--MC協(xié)議之QnA-3E報文測試 ?前面開發(fā)了自己的A-1E協(xié)議的通訊庫,實現(xiàn)了數(shù)據(jù)的讀寫,對于封裝的通訊庫,其實是一個dll文件,請看上節(jié)的dll文件,有了這個文件,就可以在項目中直

    2024年02月22日
    瀏覽(30)
  • 三菱plc數(shù)據(jù)寄存器D

    三菱plc數(shù)據(jù)寄存器D

    在輸入和輸出處理、模擬控制和位置控制期間,需要許多數(shù)據(jù)寄存器來存儲數(shù)據(jù)和參數(shù)。數(shù)據(jù)寄存器為16位,最高位為符號位。兩個數(shù)據(jù)寄存器可以組合存儲32位數(shù)據(jù),最高位仍然是符號位。 ? 數(shù)據(jù)寄存器分為以下幾類: 通用數(shù)據(jù)寄存器D0 ~ D199有200個點。 斷電/鎖存寄存器D20

    2024年02月08日
    瀏覽(29)
  • Apache POI實現(xiàn)Excel導入讀取數(shù)據(jù)和寫入數(shù)據(jù)并導出

    Apache POI POI介紹 Apache POI是用Java編寫的免費開源的跨平臺的Java API,Apache POI提供API給Java程序?qū)icrosoft Office格式檔案讀和寫的功能,其中使用最多的就是使用POI操作Excel文件。 maven坐標: POI結(jié)構(gòu): 入門案例 ExcelTest .java文件 從Excel文件讀取數(shù)據(jù)

    2024年02月12日
    瀏覽(33)
  • Java實現(xiàn)讀取轉(zhuǎn)碼寫入ES構(gòu)建檢索PDF等文檔全棧流程

    Java實現(xiàn)讀取轉(zhuǎn)碼寫入ES構(gòu)建檢索PDF等文檔全棧流程

    之前已簡單使用ES及Kibana和在線轉(zhuǎn)Base64工具實現(xiàn)了檢索文檔的demo,并已實現(xiàn)WebHook的搭建和觸發(fā)流程接口。 傳送門: 基于GitBucket的Hook構(gòu)建ES檢索PDF等文檔全棧方案 使用ES檢索PDF、word等文檔快速開始 總體思路:基于前面已經(jīng)搭建的WebHook觸發(fā)流程,接收到push更新消息之后,使用

    2024年03月10日
    瀏覽(24)
  • 三菱PLC 流水燈控制

    三菱PLC 流水燈控制

    方式一思路:每一秒讓計數(shù)器 C0 的值加一,然后將 C0 對應(yīng)的值賦值給輸出燈 Y10 - Y15。 方式二思路:每一秒讓寄存器 D0 的值向左移1位,然后使用組合位元件將 D0 的低八位值傳送給輸出燈 Y10 - Y17。 ? ?后面有更好的思路再來增加。

    2024年02月16日
    瀏覽(35)
  • 上位機開發(fā)之三菱PLC通信

    上位機開發(fā)之三菱PLC通信

    三菱MC協(xié)議是開發(fā)三菱系列PLC必須掌握的一種通信協(xié)議,其目的是讓外部設(shè)備,可以通過串行通信模塊C24或以太網(wǎng)接口模塊E71,實現(xiàn)對可編程控制器CPU的數(shù)據(jù)訪問。 MC協(xié)議是Melsec協(xié)議的簡稱。 外部設(shè)備通過C24/E71訪問可編程控制器CPU時,可以選擇不同的通信幀及數(shù)據(jù)格式來實現(xiàn)

    2023年04月08日
    瀏覽(26)
  • 【工控老馬】三菱Q系列PLC調(diào)試及三菱觸摸屏報警使用說明詳解

    【工控老馬】三菱Q系列PLC調(diào)試及三菱觸摸屏報警使用說明詳解

    一 程序段注解 第1步 編輯菜單→文檔創(chuàng)建→聲明編輯 第2步 在左側(cè)空白處雙擊→彈出行間聲明輸入彈窗→輸入申明內(nèi)容 第3步 顯示如圖,轉(zhuǎn)換+全部編譯 二 插入比較指令 第1步 編輯菜單→梯形圖編輯模式→寫入模式 第2步 在需要插入指令的地方雙擊→輸入指令內(nèi)容 第3步 顯示

    2024年02月05日
    瀏覽(23)
  • C# 三菱PLC上位機開發(fā)環(huán)境搭建

    C# 三菱PLC上位機開發(fā)環(huán)境搭建

    一、安裝軟件 用到兩個三菱的軟件: 1. MX Component(下載地址?也可以直接在官網(wǎng)上搜索,注意MX后面有空格) 用于連接PLC 2. GX Works2(下載地址?用GX Works3也行) 這個軟件主要是電氣做PLC編程,我們用來作為仿真,省去開發(fā)時擺弄真實PLC 序列號:117-570766844 二、配置軟件 MX

    2023年04月18日
    瀏覽(23)
  • 【STM32L496】使用HAL庫實現(xiàn)SPI寫入/讀取數(shù)據(jù)(AD5421)

    【STM32L496】使用HAL庫實現(xiàn)SPI寫入/讀取數(shù)據(jù)(AD5421)

    SPI協(xié)議詳解(圖文并茂+超詳細) SPI超詳細解析 【STM32筆記】HAL庫中的SPI傳輸(可利用中斷或DMA進行連續(xù)傳輸) AD5421是一款集成器件,設(shè)計用于環(huán)路供電型4-20mA智能發(fā)射器應(yīng)用。AD5421在單芯片內(nèi)提供如下特性和功能:16位DAC和電流放大器,用于對環(huán)路電流進行數(shù)字控制;用于

    2024年02月03日
    瀏覽(73)
  • PLC通信協(xié)議【三菱Q系列】MC協(xié)議

    MC協(xié)議的目的是開放PLC內(nèi)部寄存器給外部設(shè)備,實現(xiàn)外部設(shè)備和PLC的數(shù)據(jù)交互。簡單說就是允許外部設(shè)備通過MC協(xié)議來讀/寫PLC里面的寄存器 通訊方式有485和TCP/IP兩種,本次只介紹TCP/IP下的配置和通訊方法,其實兩者一樣沒啥大區(qū)別。 采用一發(fā)一收模式,外部設(shè)備主動發(fā)起通訊

    2024年02月07日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包