EtherNet/IP开发:C++开发CIP源代码

① 介绍一下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和EtherNet\IP模块测试

cpp 复制代码
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);
}

数据大小端处理

cpp 复制代码
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;
}
相关推荐
O。o.尊都假都3 小时前
UDP协议
linux·服务器·网络·网络协议·udp
左直拳3 小时前
c++中“&”符号代表引用还是取内存地址?
开发语言·c++·指针·引用·右值·取内存地址
2501_916013743 小时前
从一次被抄袭经历谈起:iOS App 安全保护实战
websocket·网络协议·tcp/ip·http·网络安全·https·udp
十年编程老舅3 小时前
二本计算机,毕业=失业?
c++·程序员·编程·秋招·c++项目·春招·qt项目
科技小E3 小时前
国标GB28181视频平台EasyCVR安防系统部署知识:如何解决异地监控集中管理和组网问题
大数据·网络·人工智能·音视频
无锡耐特森4 小时前
ProfiNet与CANopen:新能源时代的“语言翻译官”
网络·网络协议
成都渲染101云渲染66664 小时前
blender云渲染指南2025版
前端·javascript·网络·blender·maya
虾球xz4 小时前
游戏引擎学习第260天:在性能分析器中实现钻取功能
网络·c++·学习·游戏引擎
Yusei_05234 小时前
C++复习类与对象基础
c++
AORO_BEIDOU4 小时前
遨游科普:2025年,三防平板有多智能?
网络·人工智能·安全·智能手机·电脑·信息与通信