① 介绍一下CIP
CIP是一种考虑到自动化行业而设计的通用协议。然而,由于其开放性,它可以并且已经应用于更多的领域。CIP网络库包含若干卷:
第1卷介绍了适用于所有网络自适应的CIP的常见方面。本卷包含通用对象库和设备配置文件库,以及通信模型、设备配置和CIP数据管理的一般说明。本卷还定义了一个辅助配电系统,该系统对CIP的所有改造都是通用的。
-第2卷是CIP的EtherNet/IP适配,描述了CIP如何适配到以太网TCP/IP和UDP/IP传输层。它还包含第1卷中EtherNet/IP所需材料的任何扩展,如可选的工业物理层和连接器。
-第3卷是CIP的DeviceNet适配,描述了CIP如何适配到CAN数据链路层。它还包含DeviceNet所需的对第1卷中材料的任何扩展。
-第4卷是CIP的ControlNet适配,描述了CIP如何适配到ControlNet数据链路层。它包含ControlNet数据链路层的完整描述以及ControlNet所需的第1卷中材料的任何扩展。
-第5卷为CIP安全。它包含在CIP网络上实施CIP安全协议所需的信息。
第6卷是CIP的CompoNet适配,描述了CIP如何适配到CompoNet数据链路层。它包含了对CompoNet数据链接层的完整描述,以及对第1卷中材料的任何扩展,这些都是CompoNet所必需的。
-第7卷是Modbus设备与CIP体系结构的集成。本卷描述了将Modbus设备集成到CIP世界的标准。
资料下载和源代码
www.jngbus.com 广州金南瓜科技
② 上代码
C++处理CIP这块内容
代码写完,还需要大量PLC和EtherNetIP模块测试
CResult CCipHandle::SendData(EncapsulationHeader* pHeader, const char* pData, int nSize) { int nAllSize = ENCAPSULATION_HEADER_SIZE + nSize; // 使用缓存,避免次次都创建内存 vLocker lock(&m_syncSend); m_pSendDataBuffer.SetSize(nAllSize); unsigned char* pBuffer = (unsigned char*)m_pSendDataBuffer.GetString(); if (pBuffer == NULL) { return CResult(EIP_MALLOC_FAIL, GetLanguage(EIP_MALLOC_FAIL)); } // 处理转换 SetShortLH(pHeader->nCommand, pBuffer); SetShortLH(pHeader->nLength, pBuffer + 2); SetIntLH(pHeader->nSessionID, pBuffer + 4); SetIntLH(pHeader->nStatus, pBuffer + 8); SetInt64LH(pHeader->nSenderContext, pBuffer + 12); SetIntLH(pHeader->nStatus, pBuffer + 20); memcpy(pBuffer + ENCAPSULATION_HEADER_SIZE, pData, nSize); // 发送数据 return m_pCommHandle.SendData((char*)pBuffer, nSize); }
数据大小端处理
unsigned int GetIntLH(const unsigned char* pData) { __int64 nNum = 0; nNum = pData[0]; nNum += (((int)pData[1]) << 8) & 0xFF00; nNum += (((int)pData[2]) << 16) & 0xFF0000; nNum += (((int)pData[3]) << 24) & 0xFF000000; return (unsigned int)nNum; } void SetShortLH(__int64 nNum, unsigned char* pData) { pData[0] = nNum & 0xFF; pData[1] = (nNum >> 8) & 0xFF; } void SetIntLH(__int64 nNum, unsigned char* pData) { pData[0] = nNum & 0xFF; pData[1] = (nNum >> 8) & 0xFF; pData[2] = (nNum >> 16) & 0xFF; pData[3] = (nNum >> 24) & 0xFF; }