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.mzph.cn/news/638941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见的cpu高Case

介绍一些项目中遇到实际bug&#xff1a; RecyclerView中&#xff0c;每个item 都有一个不停运行的动画&#xff0c;选中1个后开始运行&#xff0c;来回点击不同的item&#xff0c;cpu会越来越高&#xff0c;原因是app:lottie_autoPlay"true"使暂停的动画的item也收到…

数据结构期末复习(5)图

图 在数据结构中&#xff0c;图&#xff08;Graph&#xff09;是由节点&#xff08;Vertex&#xff09;和边&#xff08;Edge&#xff09;组成的一种非线性数据结构。图可以用来表示不同事物之间的关系&#xff0c;比如社交网络中的用户和好友关系、城市之间的道路网络等。 图…

《繁花》中服饰公司的股票开盘价如何涨到了18.8

《繁花》中服饰公司的股票发行价是5块4一股&#xff0c;怎么就被强慕杰搞成了18.88一股的所谓开盘价呢&#xff1f; 股市里的股票其实和菜市场的白菜一样&#xff0c;发行价只是官方指导价&#xff0c;你实际能用多少钱在市面上买到&#xff0c;得看大家觉得它多少钱。或者愿意…

RLC如何通过改变频率实现输出稳压

当开关频率工作在容性区域时&#xff0c;容抗抵消完感抗还有剩余&#xff0c;所以容抗感抗可以近似为一个容抗Cr,但加上频率的改变&#xff0c;容抗又可以近似为一个可调电阻 那又改如何控制频率&#xff0c;保持输出稳压&#xff1f; 当输入与输出电压不变时&#xff0c;Rac变…

编写servlet

编写servlet 上述代码中的HTML页面将雇员ID发送给servlet。要创建servlet读取客户机发送的雇员ID并检索雇员的详细信息,需要执行以下步骤: 在“项目”选项卡中右击“Employee”节点,然后选择“新建”→Servlet。将显示“新建Servlet”对话框。在“类名”文本框中输入Employ…

苹果电脑(Mac)的node版本安装以及升降级

在开发过程中&#xff0c;对于不同的开发环境或者较老的项目可能需要切换不同的node版本&#xff0c;此过程会涉及到node版本的升级与降级&#xff0c;安装node版本管理模块n&#xff08;sudo命令&#xff09;。 全局安装n模块 sudo npm install n -g//输入后回车&#xff0c…

服务调用Ribbon,LoadBalance,Feign

服务调用Ribbon、Fegin Ribbon实现负载均衡的原理 1&#xff1a;LoadBalancerAutoConfiguration这个类&#xff0c;这个类主要做的就是把LoadBalancer拦截器封装到RestTemplte拦截器集合里面去。 2&#xff1a;然后在代码里面调用restTemplate.getForObject或者其他方法的时候&…

国产操作系统:VirtualBox安装openKylin-1.0.1虚拟机并配置网络

国产操作系统&#xff1a;VirtualBox安装openKylin-1.0.1虚拟机并配置网络 openKylin 操作系统目前适配支持X86、ARM、RISC-V三个架构的个人电脑、平板电脑及教育开发板&#xff0c;可以满足绝大多数个人用户及开发者的使用需求。适用于在VirtualBox平台上安装openKylin-1.0.1…

Python语法进阶——类

Python中的数据类型都属于类。int、str、list都是Python定义好的数据类型类。 print(type(list))#<class type> print(type(list()))#<class list> 一、自定义数据类型 一、语法 class 类名():pass #类名 要求首字母大写 #()可写可省略。 #pass在这里只是用来保证…

Unity学习-逐帧图集动画制作

首先在文件部分创建一个Sprite Library Asset 然后点击创建出来的文件 点下面的加号添加对应的图 添加完成之后点一下Apply 然后新建一个物体 添加这三个组件 其中SpriteLibrary里面 把你刚刚创建的图集文件拉过来 Sprite Resolver选择对应的动作和图片 然后开始制作动画 An…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《计及电-气-热综合能源系统的输配协同优化调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 这篇文章的标题表明文章将关注于综合能源系统&#xff0c;特别是涉及电力、气体和热能的输配协同优化调度。以下是对标题的一些关键词的解读&#xff1…

Matlab/simulink风储调频,多台飞轮储能调频,风电场调频,飞轮储能带有虚拟惯量和下垂控制,三机九节点系统一次调频,离散模型

上述为不同飞轮储能容量配比&#xff0c;风电场容量配比&#xff0c;以及有无附加频率控制的飞轮储能出力分析。 飞轮储能驱动电机为永磁同步机电机PMSG 有无飞轮储能容量较小&#xff0c;所以对频率的改善效果有限&#xff0c;不过可以继续增大容量&#xff0c;从而增大频率的…

【音视频】基于ffmpeg对视频的切割/合成/推流

背景 基于FFmpeg对视频进行切割、合成和推流的价值和意义在于它提供了一种高效、灵活且免费的方式来实现视频内容的定制、管理和分发。通过FFmpeg&#xff0c;用户可以轻松地剪辑视频片段&#xff0c;根据需要去除不必要的部分或提取特定时间段的内容&#xff0c;从而优化观看…

C#,入门教程(23)——数据类型转换的一点基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(22)——函数的基础知识https://blog.csdn.net/beijinghorn/article/details/124181689 先简单回顾一下&#xff0c;C#的数据类型大致有这样一些&#xff1a; &#xff08;1&#xff09;原始类型&#xff1a;byte, bool, int, doubl…

智慧文旅一机游:科技与文化的完美结合,引领智慧文旅新潮流,智慧旅游未来已来

一、科技与文化的完美结合&#xff1a;智慧文旅一机游的核心理念 智慧文旅一机游&#xff0c;是科技与文化相融合的产物&#xff0c;它不仅代表着旅游行业的创新与发展&#xff0c;更是一种文化与科技完美结合的生活方式。一机游的核心理念在于通过先进的科技手段&#xff0c;提…

IOT pwn

已经过了填坑的黄金时期 环境搭建 交叉编译工具链 很多开源项目需要交叉编译到特定架构上&#xff0c;因此需要安装对应的交叉编译工具链。 sudo apt install gcc-arm-linux-gnueabi g-arm-linux-gnueabi -y sudo apt install gcc-aarch64-linux-gnu g-aarch64-linux-gnu -…

【AI理论知识】高斯混合模型

基本定义 高斯混合模型&#xff08;GMM&#xff09;是单一高斯概率密度函数的延伸&#xff0c;就是用多个高斯概率密度函数&#xff08;正态分布曲线&#xff09;精确地量化变量分布&#xff0c;是将变量分布分解为若干基于高斯概率密度函数&#xff08;正态分布曲线&#xff…

两道日常练习题:洛谷P1165日志分析 + 洛谷P1553 数字反转(升级版)

两道题的代码我都会附着文字详解&#xff0c;并且会简洁说明一下思路&#xff1a; 先看第一套题目&#xff1a; 题干&#xff1a; 输入输出&#xff1a; 数据范围&#xff1a; 这很明显是一道栈的问题&#xff0c;我们只需要根据题意模拟即可&#xff0c;需要注意的是当输入的…

大模型学习笔记08——分布式训练

大模型学习笔记08——分布式训练 模型规模的扩大&#xff0c;对硬件&#xff08;算力、内存&#xff09;的发展提出要求。然而&#xff0c;因为内存墙的存在&#xff0c;单一设备的算力及容量&#xff0c;受限于物理定律&#xff0c;持续提高芯片的集成越来越困难&#xff0c;…

Vue.js:构建用户界面的渐进式框架

Vue.js是一种流行的JavaScript前端框架&#xff0c;用于构建用户界面。本文将介绍Vue.js的基本概念、特点、应用场景以及与其他框架的对比。 一、引言 在当今的前端开发领域&#xff0c;Vue.js已经成为了一个备受瞩目的框架。它的简洁、灵活和易于上手的特性使得开发人员能够…