当前位置: 首页 > news >正文

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模块测试

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

http://www.lryc.cn/news/285996.html

相关文章:

  • 【算法题】68. 文本左右对齐
  • PHP 调用 e 签宝接口签名指南
  • 穿越Flink的时间隧道:解锁实时数据之窗,掌握流处理之巅
  • 服务器与Ajax
  • Electron项目架构方案心得
  • Java中创建List接口、ArrayList类和LinkedList类的常用方法(一)
  • 顶级开源社区开发者体验实践分享
  • STM32之RTC实时时钟
  • Java JVM 堆、栈、方法区详解
  • Oracle篇—分区表和分区索引的介绍和分类(第一篇,总共五篇)
  • Vue中的模式和环境变量
  • 用ChatGPT教学、科研!亚利桑那州立大学与OpenAI合作
  • 问题解决:django模型查询报错,找不到数据库表
  • 持续集成工具Jenkins的使用之安装篇(一)
  • 【JavaScript】面向后端快速学习 笔记
  • 笨蛋学设计模式行为型模式-命令模式【19】
  • windows用msvc编译opencv、opencv-python、opencv_contrib、cuda
  • JVM实战篇:GC调优
  • C# 获取QQ会话聊天信息
  • Java中的内存溢出与内存泄漏深度解析
  • 计算机网络安全——密码学入门
  • go语言(八)---- map
  • Flutter:跨平台移动应用开发的未来
  • 二维码地址门牌管理系统:智慧城市新篇章
  • 学习JavaEE的日子 day14 继承,super(),this(),重写
  • 一文梳理Windows自启动位置
  • 【Java 设计模式】行为型之策略模式
  • go实现判断20000数据范围内哪些是素数(只能被1和它本身整除的数),采用多协程和管道实现
  • GPT只是开始,Autonomous Agents即将到来
  • ubuntu source: not found