EtherNet/IP开发:C++搭建基础模块,EtherNet/IP源代码

本文介绍了ODVA的协议层级图,特别是EtherNet/IP基于TCP/UDP的应用,讨论了如何利用C++的socket编程实现TCP/IP通讯,并提到如何通过DLL复用以减少重复工作。作者还强调了性能优化和程序稳定性的重要性。
摘要由CSDN通过智能技术生成

这里是CIP资料的协议层级图,讲解协议构造。

ODVA(www.ODVA.org)成立于1995年,是一个全球性协会,其成员包括世界领先的自动化公司。结合其成员的支持,ODVA的使命是在工业自动化中推进开放、可互操作的信息和通信技术。成员团体的基础是其在制定标准和促进通过《共同工业议定书》方面的主要共同利益™), ODVA的媒体独立网络协议,以及CIP–EtherNet/IP的网络适配™, DeviceNet™, CompoNet™ 和ControlNet™. ODVA管理这些技术,并在一个通用结构中开发和分发这四个网络的规范,以帮助确保一致性和准确性。下图说明了由四个网络组成的库的组织结构。

中文总线资料和方案 www.jngbus.com

广州金南瓜科技

我们可以看到,其中一个EtherNet/IP是基于TCP/UDP之上。

那么我们就可以理解为,基于socket应用之上就可以了。

如果只是纯应用角度去开发EtherNet/IP,可以借助一些成熟的socket库。奈何我们早期学C++的人,没有那么多成熟模块,都是靠自己撸出来。

把TCP/IP通讯单独做成一个dll

① 目的是后续我们讲解开发modbus tcp、profinet等这些以太网协议时候,就不需要每种协议都单独写一次TCP/UDP通讯了

头文件代码


// 用于TCP/IP通讯
class CTcpCommunication : public CTcpCommExport
{
public:
    CTcpCommunication();
    virtual ~CTcpCommunication();

    // 释放
    void Release();    

    void SetCallback(OnCommDataHandle* pDataCallback, OnCommEventNotify* pEventCallback, void* pObject);
    CResult Connect(const char* pIP, __int32 nPort);        // 连接
    void Disconnect();                                        // 关闭连接
    CResult SendData(const char* pData, __int32 nSize);        // 数据发读
    void SetLanguage(__int32 nType);

protected:

    // 数据接收    
private:
    
    void InitSockWSA();
    void ReleaseSockWSA();

    // 接收数据线程
    void CreateRecvThread();        // 创建接收线程
    void ExitRecvThread();            // 退出接收线程
    static void RunRecvThread(void* lp);
    void RecvHandle();
    bool IsExitThread();
    void OneRecvData();                // 一次接收数据
    void StartRecvData();            // 开始接收数据
    void StopRecvData();            
    void CloseConnect();            // 关闭通讯

private:

    CData m_pData;

};

② socket处理很简单,其实就是围绕着收发

connect和send、recv

至于性能问题,就是如何优化在这处理和同步问题了。

程序稳定可靠需要靠自身的积累了。

建立通讯代码。

	if(m_hSock == INVALID_SOCKET)
	{
		m_hSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
		if(m_hSock != INVALID_SOCKET)
		{		
			if(connect(m_hSock, (struct sockaddr*)&m_pSA, sizeof(m_pSA)) < 0)
			{					
				closesocket(m_hSock);
				m_hSock = INVALID_SOCKET;	

				// MC TCP连接失败,请查看网络是否通讯上、或者端口问题
				return CResult(TCP_SOCKET_CONNECT_FAIL, GetLanguage(TCP_SOCKET_CONNECT_FAIL));			
			}	
		}
		else
		{
			return CResult(TCP_SOCKET_CREATE_FAIL,  GetLanguage(TCP_SOCKET_CREATE_FAIL));				
		}
	}

	return CResult();

发送数据

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成Ethernet/IP协议栈的代码需要使用相应的开发工具和支持。以下是一些可能用到的工具和步骤: 1. 选择开发平台和编程语言 Ethernet/IP协议栈可以在不同的开发平台和编程语言上实现,例如C/C++、Python、Java等。选择合适的开发平台和编程语言需要考虑到应用场景、性能要求和开发人员的技术水平等因素。 2. 确定协议栈功能和接口 根据实际需求,确定Ethernet/IP协议栈的功能和接口。这需要考虑到通信模式、传输协议、数据格式和应用层协议等因素。 3. 选择开源代码或者商业代码 对于开源协议栈,可以在相应的仓库中获取源代码和文档,根据实际需求进行修改和定制。对于商业协议栈,可以联系供应商获取相应的开发工具和支持。 4. 进行代码开发和测试 根据协议栈的功能和接口进行代码开发和测试。这需要进行相应的编码、编译、调试和测试工作,以确保协议栈能够稳定地运行并满足实际需求。 5. 集成和应用 将Ethernet/IP协议栈集成到相应的应用中,并进行相应的应用开发和测试。这需要根据实际需求进行相应的接口开发、数据交换和状态监测等工作,以确保应用正常运行并满足实际需求。 总的来说,生成Ethernet/IP协议栈需要进行一系列的工作,包括平台和语言选择、功能和接口确定、代码开发和测试、集成和应用等。这需要具备一定的技术水平和相关工具和支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值