ok卡官網(wǎng)支持的pos機(jī)器,三菱PLC的MC通信協(xié)議分析和實(shí)現(xiàn)

 新聞資訊2  |   2023-06-25 09:34  |  投稿人:pos機(jī)之家

網(wǎng)上有很多關(guān)于ok卡官網(wǎng)支持的pos機(jī)器,三菱PLC的MC通信協(xié)議分析和實(shí)現(xiàn)的知識(shí),也有很多人為大家解答關(guān)于ok卡官網(wǎng)支持的pos機(jī)器的問(wèn)題,今天pos機(jī)之家(m.afbey.com)為大家整理了關(guān)于這方面的知識(shí),讓我們一起來(lái)看下吧!

本文目錄一覽:

1、ok卡官網(wǎng)支持的pos機(jī)器

ok卡官網(wǎng)支持的pos機(jī)器

大家好,今天我來(lái)說(shuō)一下上位機(jī)與三菱PLC的通信協(xié)議MC協(xié)議。

MC協(xié)議概述

官方的定義:MC通訊協(xié)議,就是對(duì)方設(shè)備通過(guò)C24或者E71模塊與PLC 的CPU軟元件數(shù)據(jù)和程序的讀出/寫入PLC用的通訊方式的名稱。

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

在三菱PLC的通訊設(shè)置端,如下圖所示,通信協(xié)議設(shè)置中有很多種類型。第一種是無(wú)順序協(xié)議,這是直接通過(guò)TCP/UDP發(fā)送數(shù)據(jù)給PC上位機(jī)端,上位機(jī)也只直接發(fā)送數(shù)據(jù),這種情況下PLC要去解析數(shù)據(jù)格式,相對(duì)來(lái)說(shuō)比較麻煩, 我只做過(guò)與松下PLC直接按照無(wú)協(xié)議通訊做過(guò)項(xiàng)目,對(duì)方的工程師調(diào)試這個(gè)無(wú)協(xié)議搞了一周,比較繁瑣,不推薦使用。

GX Developer 設(shè)置MC協(xié)議

還有就是MC協(xié)議,我寫的程序是參考《Q系列MELSEC通訊協(xié)議參考手冊(cè)(中文).pdf》寫的,協(xié)議可以參見我CSDN博客中https://download.csdn.net/download/yangchuang1992/10911284

MC協(xié)議類型表格

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

QnA兼容3C幀、QnA兼容4C幀、QnA兼容3E幀可以訪問(wèn)Q/QnA PLC CPU 全部軟元件和全部文件。

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

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

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

我這里只說(shuō)寄存器D的讀寫操作

ASCII模式如下1. 串口QnA兼容3C幀格式(格式1,2,3,4都行),

使用格式3來(lái)讀寄存器說(shuō)明報(bào)文

由于串口數(shù)據(jù)不能一次性發(fā)送,數(shù)據(jù)是分多次發(fā)送的, 所以一個(gè)完整的幀數(shù)據(jù)有起始和結(jié)尾符標(biāo)記, STX =0X02 表示開始 ETX=0X03表示結(jié)尾符, 代表一幀數(shù)據(jù)完成。

寫入PLC報(bào)文

要注意這里的寄存器編號(hào)要是6位,不足補(bǔ)0, 讀取個(gè)數(shù)是十六進(jìn)制表示

正?;貜?fù):

正常返回報(bào)文

其中,數(shù)據(jù)部分有大小端區(qū)分,如果數(shù)據(jù)超過(guò)了65535,就要用2個(gè)字表示,高低位要互換

異?;貜?fù):

異常返回報(bào)文

其中出錯(cuò)編碼可以在PLC相關(guān)手冊(cè)中查詢。

使用格式3來(lái)寫寄存器寫說(shuō)明報(bào)文

上位機(jī)寫入數(shù)據(jù):

寫入PLC數(shù)據(jù)報(bào)文

正常返回:

寫入正常報(bào)文

異常返回:

2.QnA 兼容 3E 幀

讀數(shù)據(jù):

讀數(shù)據(jù)報(bào)文

正常返回

正常返回報(bào)文

異常返回

寫數(shù)據(jù):

寫數(shù)據(jù)報(bào)文

正常返回

正常返回報(bào)文

異常返回

異常返回報(bào)文

/// 讀取的數(shù)據(jù)

private int ReadMitNWord(string strIoName, int nNum, ref string result)

{

int nRet = PLCReturn.PLC_OK;

if (null == _Connection)

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

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")

{

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

}

//發(fā)送報(bào)文

_Connection.SendData(sendData);

//接收?qǐng)?bào)文-->內(nèi)部已經(jīng)有1秒超時(shí)

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")) //正常結(jié)束

{

}

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

{

//截取數(shù)據(jù)

result = recvData.Substring(14);

nRet = PLCReturn.PLC_ERR;

}

}

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

{

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

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

{

//獲取數(shù)據(jù)部分

nRet = PLCReturn.PLC_OK;

result = recvData.Substring(22);

}

else//異常結(jié)束

{

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連接對(duì)象位null");

string sendData = "";

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

{

sendData = string.Format("{0}{1}0000D*{2}{3:X3}{4}", GetHeader(), Type.Write, strIoname, nNum, data);

}

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

{

int dataLength = 24 + nNum * 4;

sendData = string.Format("{0}{1:X4}0010{2}0000D*{3}{4:X4}{5}", GetHeader(), dataLength, Type.Write, strIoname, nNum, data);

}

//發(fā)送數(shù)據(jù)

_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"))//異常

{

}

}

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

{

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

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

{

//獲取數(shù)據(jù)部分

}

else//異常結(jié)束

{

}

}

}

}

我以寫入PLC位置為例子,結(jié)構(gòu)體PlcDefine.PlcPfPos是x,y,z坐標(biāo):

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);

//轉(zhuǎn)換數(shù)據(jù)

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;

}

以上就是關(guān)于ok卡官網(wǎng)支持的pos機(jī)器,三菱PLC的MC通信協(xié)議分析和實(shí)現(xiàn)的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于ok卡官網(wǎng)支持的pos機(jī)器的知識(shí),希望能夠幫助到大家!

轉(zhuǎn)發(fā)請(qǐng)帶上網(wǎng)址:http://m.afbey.com/newsone/73282.html

你可能會(huì)喜歡:

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 babsan@163.com 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。