1. 首頁 > 汽車知識網 > 汽車知識

    三菱mc協議,三菱MC協議手冊

    大家好,今天我來說一下上位機與三菱PLC的通信協議MC協議。

    MC協議概述

    官方的定義:MC通訊協議,就是對方設備通過C24或者E71模塊與PLC 的CPU軟元件數據和程序的讀出/寫入PLC用的通訊方式的名稱。

    以上聽得拗口,口語化表達的意思就是:PC電腦通過C24模塊或者E71模塊,按照一定的數據格式,讀寫PLC軟元件的過程。

    在三菱PLC的通訊設置端,如下圖所示,通信協議設置中有很多種類型。第一種是無順序協議,這是直接通過TCP/UDP發送數據給PC上位機端,上位機也只直接發送數據,這種情況下PLC要去解析數據格式,相對來說比較麻煩, 我只做過與松下PLC直接按照無協議通訊做過項目,對方的工程師調試這個無協議搞了一周,比較繁瑣,不推薦使用。

    GX Developer 設置MC協議

    MC協議類型表格

    MC協議的目的是開放PLC內部寄存器給外部設備,實現外部設備和PLC的數據交互。簡單說就是允許外部設備通過MC協議來讀/寫PLC里面的寄存器 2. 通信協議方式 通訊方式有485和TCP/IP兩種,本次只介紹TCP/IP下的配置和通訊方法,其。

    對象模塊中C24代表串口(RS232 RS485),E71代表網口通信,這個要看具體的PLC那端通信是串口還是網口。串口 通訊幀(數據格式)有四種,QnA兼容3C幀,QnA兼容4C幀,QnA兼容2C幀,A兼容1C幀,形式對應著1~5,對應著PLC中就是上上圖中的下拉列表中的格式1到5。數據格式有ASCII代碼和二進制代碼,那上面最多可以組合出10種通訊格式, 那是不是我們都要實現呢?

    三菱MC協議手冊,QnA兼容3C幀、QnA兼容4C幀、QnA兼容3E幀可以訪問Q/QnA PLC CPU 全部軟元件和全部文件。

    QnA兼容2C幀,可以訪問QnA PLC CPU軟元件和全部文件

    A 兼容 1C 幀 A 兼容 1E 幀 ,可以訪問QnA PLC CPU軟元件和全部文件

    綜上,我們串口使用QnA兼容3C幀,網口QnA兼容3E幀,可以覆蓋Q/QnA系列的PLC讀取。

    我這里只說寄存器D的讀寫操作

    ASCII模式如下

    1. 串口QnA兼容3C幀格式(格式1,2,3,4都行)。

    使用格式3來讀寄存器說明報文

    由于串口數據不能一次性發送,數據是分多次發送的, 所以一個完整的幀數據有起始和結尾符標記, STX =0X02 表示開始 ETX=0X03表示結尾符, 代表一幀數據完成。

    寫入PLC報文

    要注意這里的寄存器編號要是6位,不足補0, 讀取個數是十六進制表示

    正常回復:

    以下對三菱Mc協議的概要進行說明。(1) MC協議是指,用于外部設備經由C24或E71對可編程控制器CPU的軟元件數據、程序進行讀取/寫入等的Q/L系列可編程控制器用的通信方式的名稱。只要是可安裝應用程序且可通過MC協議的控制步。

    正常返回報文

    其中,數據部分有大小端區分,如果數據超過了65535,就要用2個字表示,高低位要互換

    異常回復:

    異常返回報文

    其中出錯編碼可以在PLC相關手冊中查詢。

    使用格式3來寫寄存器寫說明報文

    上位機寫入數據:

    內置以太網和上位機通信有兩種方式:1 設置為MC協議,上位機通過發送MC協議報文來讀寫。2 用MX COMPONENT軟件,里面提供一些上位機高級編程語言的一些控件,可以直接在上位機軟件中調用。

    寫入PLC數據報文

    正常返回:

    寫入正常報文

    異常返回:

    2.QnA 兼容 3E 幀

    讀數據:

    讀數據報文

    正常返回

    正常返回報文

    異常返回

    寫數據:

    寫數據報文

    正常返回

    正常返回報文

    異常返回

    異常返回報文

    // 讀取的數據

    {

    1、標準協議(modbus rtu\tcp);2、專用網絡(CC-Link系列,DP,PN,EIP,DeviceNet,CANopen等);3、三菱專用協議(MC,SLMP,變頻器通訊);4、無順序協議(串口RS,socket等)。通訊設備分類:1、PLC和PLC;2、PLC和上位。

    int nRet = PLCReturn.PLC_OK;

    if (null == _Connection)

    throw new Exception("PLC連接對象位null");

    三菱mc協議

    string sendData = "";

    if (_Connection.ConnectType() == "COM")

    {

    sendData = string.Format("{0}{1}0000D*{2}{3:X4}{4}",GetHeader(), Type.Read,strIoName,nNum,(char)0x03);

    }

    else if (_Connection.ConnectType() == "TCP")

    {

    }

    //發送報文

    _Connection.SendData(sendData);

    //接收報文-->內部已經有1秒超時

    string recvData = _Connection.GetResponse(1000);

    if (!string.IsNullOrEmpty(recvData))

    {

    //去掉末尾多余的 \0

    recvData = recvData.TrimEnd('\0');

    byte[] redvBytes = Encoding.ASCII.GetBytes(recvData);

    if (_Connection.ConnectType() == "COM")

    {

    if (recvData.Contains("QACK")) //正常結束

    三菱mc協議

    {

    }

    else if (recvData.Contains("QNAK"))//異常結束

    {

    //截取數據

    result = recvData.Substring(14);

    nRet = PLCReturn.PLC_ERR;

    }

    }

    else if (_Connection.ConnectType() == "TCP")

    {

    string resultCOde = recvData.Substring(18,4);

    if (resultCOde.Contains("0000")) //正常結束

    {

    //獲取數據部分

    nRet = PLCReturn.PLC_OK;

    result = recvData.Substring(22);

    }

    else//異常結束

    {

    nRet = PLCReturn.PLC_ERR;

    }

    }

    }

    else

    {

    nRet = PLCReturn.PLC_TIMEOUT;

    }

    return nRet;

    }

    /寫入

    private void WriteMitNWord(string strIoname,int nNum,string data)

    {

    if (null == _Connection)

    throw new Exception("PLC連接對象位null");

    string sendData = "";

    if (_Connection.ConnectType() == "COM")

    {

    }

    else if (_Connection.ConnectType() == "TCP")

    {

    int dataLength = 24 + nNum * 4;

    }

    //發送數據

    _Connection.SendData(sendData);

    string recvData = _Connection.GetResponse(1000);

    if (!string.IsNullOrEmpty(recvData))

    {

    if (_Connection.ConnectType() == "COM")

    {

    if (recvData.Contains("QACK"))//成功

    {

    }

    else if (recvData.Contains("QNAK"))//異常

    {

    三菱mc協議

    }

    }

    else if (_Connection.ConnectType() == "TCP")

    {

    string resultCOde = recvData.Substring(18,21);

    if (resultCOde.Contains("0000")) //正常結束

    {

    //獲取數據部分

    }

    else//異常結束

    {

    }

    }

    }

    }

    我以寫入PLC位置為例子,結構體PlcDefine.PlcPfPos是x,y,z坐標:

    public int SetPfMovePos(int nPfNo,PlcDefine.PlcPfPos pos)

    {

    int nRet = PLCReturn.PLC_OK;

    if (pos.Angle < 0)

    pos.Angle = pos.Angle + 360;

    if (pos.Angle >= 360)

    pos.Angle = pos.Angle - 360;

    string strIOName = string.Format("{0:D6}",6020);

    int nX = (int)(pos.X * 10000);

    int nY = (int)(pos.Y * 10000);

    int nA = (int)(pos.Angle * 100000);

    //轉換數據

    string strData = string.Empty;

    strData += Invert2Word(string.Format("{0:X8}",nX));

    strData += Invert2Word(string.Format("{0:X8}",nY));

    strData += Invert2Word(string.Format("{0:X8}",nA));

    WriteMitNWord(strIOName,6,strData);

    return nRet;

    }

    版權聲明:本站文章均來源于網絡,如有侵權請聯系刪除!

    聯系我們

    在線咨詢:點擊這里給我發消息

    QQ:

    工作日:9:30-18:30,節假日休息

    老婆的视频完整版在线观看