OmronFINS通信现在由OneConnectAPI源代码支持。

      最后更新: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;
      }
      
      
      
      
      
      
      
      
      
      
      

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/14156.html

          热门文章

          文章分类