最后更新:2021-12-04 07:16:15 手机定位技术交流文章
每个PLC制造商有自己的通信协议,如三菱的MC和Bev的ADS,但没有共同的接口协议。
每个发电机、MES和工厂,除其他外,必须为每种产品建立一个适当的通信界面,以便适应每一种通信。
为了建立一个共同的界面,OneConnectAPI适应了每个制造商的协议,为中国工业和监管行业的快速扩张作出贡献是浪费时间和金钱,每家公司都必须在不保证稳定和持续维护的情况下重新发明其轮子。
我们使用高效的多两次处理软件,确保阅读和写作性能极有效率,计算机性能需求极低,连续读写操作,以及CPU使用率不到1%(与Atom E3940测试),(与Atom E3940测试)令人信服的高效多两次处理程序,确保阅读和写作性能极有效率,计算机性能要求极低,连续读写操作,以及CPU使用率不到1%(与Atom E3940测试)。
在其中一台控制机器上,用户可以对数百个PLC进行积极的读写,我们在太阳能部门广泛实施和证明了这一点。
虽然我们多年来在半导体业务中进行了深入的工作,并获得了履行我们职能的丰富经验,但我们也需要确保高度严格的稳定,有晶体圆环生产设备,7* 24小时不能失效。
这些是界面库下载和源代码。
不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,
https://download.csdn.net/download/jacp_haik/55020678
30806722(通讯)
demo界面

接口示例
#pragma once
#include <string>
#include "InterfaceExport.h"
#include "ModuleDevelopH.h"
// 欧姆龙Fins协议
class CFins
{
public:
CFins();
virtual ~CFins();
// 参数
CResult SetIP(std::string pIP); // 设置地址
CResult SetPort(int nPort); // 设置端口号
CResult SetTimeout(int nTimeMs); // 设置超时
// 读出
CResult Read(std::string pAddr, char& pData);
CResult Read(std::string pAddr, __int16& pData);
CResult Read(std::string pAddr, __int32& pData);
CResult Read(std::string pAddr, __int64& pData);
CResult Read(std::string pAddr, char* pData, int nSize);
CResult Read(std::string pAddr, __int16* pData, int nSize);
CResult Read(std::string pAddr, __int32* pData, int nSize);
CResult Read(std::string pAddr, __int64* pData, int nSize);
// 写入
CResult Write(std::string pAddr, char& pData);
CResult Write(std::string pAddr, __int16& pData);
CResult Write(std::string pAddr, __int32& pData);
CResult Write(std::string pAddr, __int64& pData);
CResult Write(std::string pAddr, char* pData, __int32 nSize);
CResult Write(std::string pAddr, __int16* pData, __int32 nSize);
CResult Write(std::string pAddr, __int32* pData, __int32 nSize);
CResult Write(std::string pAddr, __int64* pData, __int32 nSize);
private:
CResult SetParament(std::string pName, std::string pValue);
CResult SetParament(std::string pName, int nValue);
private:
CInterfaceExport* m_pFins;
CMgrDllDelegate m_pLoadInterface;
};
使用方法
==

金融业内部交流机制
#Pragma一度 # 包括“ communization.h' cFINSHandle:public Corporation public: CFINSHandle (); 长读MemoryData (in nAddr, int nSize, FINS_DATA_TYPE: ENUM nType, int16* pData);
通讯实现代码
#include "stdafx.h"
#include "FinsHandle.h"
CFinsHandle::CFinsHandle()
{
m_bEstablishCommunicationByFins = false;
m_nIpNode = 0;
}
// 重写数据接收,用于协议识别
void CFinsHandle::OnDataRecv(char* pData, int nSize)
{
if (nSize > 0)
{
m_pRecvData.Append(pData, nSize);
if (m_pRecvData.Size() >= FINS_TCP_HEAD_SIZE)
{
FINS_TCP_HEAD pHead;
pHead.SetData(m_pRecvData.GetString());
int nAllSize = pHead.GetLength();
if (m_pRecvData.Size() >= nAllSize)
{
SetRecvComplete(nAllSize);
}
}
}
}
// 重写数据接收,开始接收数据,用于协议识别
void CFinsHandle::OnBeginRecv()
{
m_pRecvData.SetSize(0);
}
// 通讯关闭
void CFinsHandle::OnCloseConnect()
{
m_bEstablishCommunicationByFins = false;
}
long CFinsHandle::ReadMemoryData(int nAddr, int nSize, FINS_DATA_TYPE::ENUM nType, __int16* pData)
{
long nCode = 0;
if(nCode = EstablishCommunicationByFins())
{
return nCode;
}
CMyString pSendData;
// 获取发送内存
int nAllSize;
nAllSize = FINS_TCP_HEAD_SIZE;
nAllSize += FINS_CONTROL_HEAD_SIZE;
nAllSize += FINS_MEMORY_AREA_READ_SIZE;
pSendData.SetSize(nAllSize);
char* pBuff = pSendData.GetString();
// 头部信息
FINS_TCP_HEAD pHead;
pHead.nCommand = FINS_TCP_CMD_DATA;
pHead.SetLength(nAllSize); //长度
pHead.GetData(pBuff);
// control部分
FINS_CONTROL_HEAD pControlHead;
pControlHead.nDA1 = 0;
pControlHead.nSA1 = m_nIpNode;
pControlHead.nCmd1 = 0x01;
pControlHead.nCmd2 = 0x01;
pControlHead.GetData(pBuff + FINS_TCP_HEAD_SIZE);
// 数据部分
FINS_MEMORY_AREA_READ pMemory;
pMemory.nAreaCode = nType;
pMemory.nAddr = nAddr;
pMemory.nBitNo = 0;
pMemory.nLength = nSize;
pMemory.GetData(pBuff + FINS_TCP_HEAD_SIZE + FINS_CONTROL_HEAD_SIZE);
// // 发送数据
CMyString pRecvData;
nCode = SendSyncData(pSendData, pRecvData);
if (nCode == 0)
{
// 先判断答复数据的头数据是否正确
if(nCode = CheckReplyDataIsError(pRecvData.GetString(), pRecvData.Size()))
{
return nCode;
}
// 数据头
FINS_TCP_HEAD pHeadReply;
pHeadReply.SetData(pRecvData.GetString());
// 答复长度要求
int nMinSize = FINS_TCP_HEAD_SIZE + FINS_CONTROL_HEAD_SIZE + FINS_MEMORY_AREA_READ_FIX_R_SIZE + nSize * 2;
if(pHeadReply.GetLength() < nMinSize)
{
return FINS_REPLY_READ_DATA_TOO_SHORT;
}
else
{
// FINS协议部分
FINS_CONTROL_HEAD pControlHeadReply;
pControlHeadReply.SetData(pRecvData.GetString());
if (pControlHeadReply.nCmd1 != pControlHead.nCmd1 ||
pControlHeadReply.nCmd2 != pControlHead.nCmd2)
{
// 命令不一致
return FINS_REPLY_CMD_NO_IS_REQUST_CMD;
}
// 答复数据
FINS_MEMORY_AREA_READ_REPLY pReplyData;
pReplyData.SetData(pRecvData.GetString(), pRecvData.Size());
if(pReplyData.nEndCode != 0)
{
return FINS_REPLY_READ_DATA_FAIL;
}
// 拷贝数据
int nReadByte = nSize * 2;
if (pReplyData.GetDataBytsSize() == nReadByte)
{
memcpy(pData, pReplyData.GetData(), nReadByte);
}
else
{
return FINS_REPLY_READ_DATA_TOO_SHORT;
}
}
}
return nCode;
}
long CFinsHandle::WriteMemoryData(int nAddr, int nSize, FINS_DATA_TYPE::ENUM nType, __int16* pData)
{
long nCode = 0;
if(nCode = EstablishCommunicationByFins())
{
return nCode;
}
CMyString pSendData;
int nBytsSize = nSize * 2;
// 获取发送内存
int nAllSize;
nAllSize = FINS_TCP_HEAD_SIZE;
nAllSize += FINS_CONTROL_HEAD_SIZE;
nAllSize += FINS_MEMORY_AREA_READ_SIZE;
nAllSize += nBytsSize;
pSendData.SetSize(nAllSize);
char* pBuff = pSendData.GetString();
// 头部信息
FINS_TCP_HEAD pHead;
pHead.nCommand = FINS_TCP_CMD_DATA;
pHead.SetLength(nAllSize); //长度
pHead.GetData(pBuff);
// control部分
FINS_CONTROL_HEAD pControlHead;
pControlHead.nDA1 = 0;
pControlHead.nSA1 = m_nIpNode;
pControlHead.nCmd1 = 0x01;
pControlHead.nCmd2 = 0x02;
pControlHead.GetData(pBuff + FINS_TCP_HEAD_SIZE);
// 数据部分
FINS_MEMORY_AREA_WRITE pMemory;
pMemory.nAreaCode = nType;
pMemory.nAddr = nAddr;
pMemory.nBitNo = 0;
pMemory.nLength = nSize;
pMemory.pData.Append((char*)pData, nBytsSize);
pMemory.GetData(pBuff + FINS_TCP_HEAD_SIZE + FINS_CONTROL_HEAD_SIZE);
// // 发送数据
CMyString pRecvData;
nCode = SendSyncData(pSendData, pRecvData);
if (nCode == 0)
{
// 先判断答复数据的头数据是否正确
if(nCode = CheckReplyDataIsError(pRecvData.GetString(), pRecvData.Size()))
{
return nCode;
}
// 数据头
FINS_TCP_HEAD pHeadReply;
pHeadReply.SetData(pRecvData.GetString());
// 答复长度要求
int nMinSize = FINS_TCP_HEAD_SIZE + FINS_CONTROL_HEAD_SIZE + FINS_MEMORY_AREA_WRITE_R_SIZE;
if(pHeadReply.GetLength() < nMinSize)
{
return FINS_REPLY_READ_DATA_TOO_SHORT;
}
else
{
// FINS协议部分
FINS_CONTROL_HEAD pControlHeadReply;
pControlHeadReply.SetData(pRecvData.GetString());
if (pControlHeadReply.nCmd1 != pControlHead.nCmd1 ||
pControlHeadReply.nCmd2 != pControlHead.nCmd2)
{
// 命令不一致
return FINS_REPLY_CMD_NO_IS_REQUST_CMD;
}
// 答复数据
FINS_MEMORY_AREA_WRITE_REPLY pReplyData;
pReplyData.SetData(pRecvData.GetString());
if(pReplyData.nEndCode != 0)
{
return FINS_REPLY_WRITE_DATA_FAIL;
}
}
}
return nCode;
}
// 获取fins节点地址
long CFinsHandle::GetFinsNodeAddress()
{
return 0;
}
// 检查答复数据是否错误
long CFinsHandle::CheckReplyDataIsError(char* pData, int nSize)
{
if (nSize < FINS_TCP_HEAD_SIZE)
{
// 小于最小要求数据
return FINS_REPLY_DATA_TOO_SHORT;
}
// 消息错误
FINS_TCP_HEAD pHeadReply;
pHeadReply.SetData(pData);
if (pHeadReply.nErrorCode)
{
return FINS_REPLY_ERROR_BY_MESSAGE;
}
return 0;
}
// 建立通讯
long CFinsHandle::EstablishCommunicationByFins()
{
if (m_bEstablishCommunicationByFins)
{
// 已经建立通讯连接了
return 0;
}
long nCode = 0;
CMyString pSendData;
// 获取发送内存
int nAllSize;
nAllSize = FINS_TCP_HEAD_SIZE;
nAllSize += FINS_CONNECT_REQUST_SIZE;
pSendData.SetSize(nAllSize);
char* pBuff = pSendData.GetString();
// 头部信息
FINS_TCP_HEAD pHead;
pHead.nCommand = FINS_TCP_CMD_CONNECT_REQUST;
pHead.SetLength(nAllSize); //长度
pHead.GetData(pBuff);
// IP地址
FINS_CONNECT_REQUST pConnectRequst;
pConnectRequst.GetData(pBuff + FINS_TCP_HEAD_SIZE);
// 发送数据
CMyString pRecvData;
if(nCode = SendSyncData(pSendData, pRecvData))
{
return nCode;
}
// 处理返回值
FINS_TCP_HEAD pHeadReply;
pHeadReply.SetData(pRecvData.GetString());
// 检查头信息
if (pHeadReply.nErrorCode == 0 &&
pHeadReply.nCommand == FINS_TCP_CMD_CONNECT_RESPONSE)
{
// 提取 IP Node信息
if (pHeadReply.GetLength() == FINS_TCP_HEAD_SIZE + FINS_CONNECT_RESPONS_SIZE)
{
// 提取
FINS_CONNECT_RESPONSE pConnectResponse;
pConnectResponse.SetData(pRecvData.GetString());
m_nIpNode = pConnectResponse.pClientAddrss[3];
// 建立通讯成功
m_bEstablishCommunicationByFins = true;
return 0;
}
}
return FINS_REQUST_CONNECT_FAIL;
}
本文由 在线网速测试 整理编辑,转载请注明出处。