ok卡官网支持的pos机器,三菱PLC的MC通信协议分析和实现

 新闻资讯2  |   2023-06-25 09:34  |  投稿人:pos机之家

网上有很多关于ok卡官网支持的pos机器,三菱PLC的MC通信协议分析和实现的知识,也有很多人为大家解答关于ok卡官网支持的pos机器的问题,今天pos机之家(www.poszjia.com)为大家整理了关于这方面的知识,让我们一起来看下吧!

本文目录一览:

1、ok卡官网支持的pos机器

ok卡官网支持的pos机器

大家好,今天我来说一下上位机与三菱PLC的通信协议MC协议。

MC协议概述

官方的定义:MC通讯协议,就是对方设备通过C24或者E71模块与PLC 的CPU软元件数据和程序的读出/写入PLC用的通讯方式的名称。

以上听得拗口,口语化表达的意思就是:PC电脑通过C24模块或者E71模块,按照一定的数据格式,读写PLC软元件的过程。

在三菱PLC的通讯设置端,如下图所示,通信协议设置中有很多种类型。第一种是无顺序协议,这是直接通过TCP/UDP发送数据给PC上位机端,上位机也只直接发送数据,这种情况下PLC要去解析数据格式,相对来说比较麻烦, 我只做过与松下PLC直接按照无协议通讯做过项目,对方的工程师调试这个无协议搞了一周,比较繁琐,不推荐使用。

GX Developer 设置MC协议

还有就是MC协议,我写的程序是参考《Q系列MELSEC通讯协议参考手册(中文).pdf》写的,协议可以参见我CSDN博客中https://download.csdn.net/download/yangchuang1992/10911284

MC协议类型表格

对象模块中C24代表串口(RS232 RS485),E71代表网口通信,这个要看具体的PLC那端通信是串口还是网口。串口 通讯帧(数据格式)有四种,QnA兼容3C帧,QnA兼容4C帧,QnA兼容2C帧,A兼容1C帧,形式对应着1~5,对应着PLC中就是上上图中的下拉列表中的格式1到5。数据格式有ASCII代码和二进制代码,那上面最多可以组合出10种通讯格式, 那是不是我们都要实现呢?

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, 读取个数是十六进制表示

正常回复:

正常返回报文

其中,数据部分有大小端区分,如果数据超过了65535,就要用2个字表示,高低位要互换

异常回复:

异常返回报文

其中出错编码可以在PLC相关手册中查询。

使用格式3来写寄存器写说明报文

上位机写入数据:

写入PLC数据报文

正常返回:

写入正常报文

异常返回:

2.QnA 兼容 3E 帧

读数据:

读数据报文

正常返回

正常返回报文

异常返回

写数据:

写数据报文

正常返回

正常返回报文

异常返回

异常返回报文

/// 读取的数据

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

{

int nRet = PLCReturn.PLC_OK;

if (null == _Connection)

throw new Exception("PLC连接对象位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);

}

//发送报文

_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")) //正常结束

{

}

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

{

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

}

//发送数据

_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")) //正常结束

{

//获取数据部分

}

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;

}

以上就是关于ok卡官网支持的pos机器,三菱PLC的MC通信协议分析和实现的知识,后面我们会继续为大家整理关于ok卡官网支持的pos机器的知识,希望能够帮助到大家!

转发请带上网址:http://www.poszjia.com/newsone/73282.html

你可能会喜欢:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 babsan@163.com 举报,一经查实,本站将立刻删除。