這里是CIP資料的協(xié)議層級圖,講解協(xié)議構造。
ODVA(www.ODVA.org)成立于1995年,是一個全球性協(xié)會,其成員包括世界領先的自動化公司。結合其成員的支持,ODVA的使命是在工業(yè)自動化中推進開放、可互操作的信息和通信技術。成員團體的基礎是其在制定標準和促進通過《共同工業(yè)議定書》方面的主要共同利益?), ODVA的媒體獨立網(wǎng)絡協(xié)議,以及CIP–EtherNet/IP的網(wǎng)絡適配?, DeviceNet?, CompoNet? 和ControlNet?. ODVA管理這些技術,并在一個通用結構中開發(fā)和分發(fā)這四個網(wǎng)絡的規(guī)范,以幫助確保一致性和準確性。下圖說明了由四個網(wǎng)絡組成的庫的組織結構。
中文總線資料和方案?www.jngbus.com
廣州金南瓜科技
我們可以看到,其中一個EtherNet/IP是基于TCP/UDP之上。
那么我們就可以理解為,基于socket應用之上就可以了。
如果只是純應用角度去開發(fā)EtherNet/IP,可以借助一些成熟的socket庫。奈何我們早期學C++的人,沒有那么多成熟模塊,都是靠自己擼出來。
把TCP/IP通訊單獨做成一個dll
① 目的是后續(xù)我們講解開發(fā)modbus tcp、profinet等這些以太網(wǎng)協(xié)議時候,就不需要每種協(xié)議都單獨寫一次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);?? ??? ?// 數(shù)據(jù)發(fā)讀
?? ?void SetLanguage(__int32 nType);
protected:
?? ?// 數(shù)據(jù)接收?? ?
private:
?? ?
?? ?void InitSockWSA();
?? ?void ReleaseSockWSA();
?? ?// 接收數(shù)據(jù)線程
?? ?void CreateRecvThread();?? ??? ?// 創(chuàng)建接收線程
?? ?void ExitRecvThread();?? ??? ??? ?// 退出接收線程
?? ?static void RunRecvThread(void* lp);
?? ?void RecvHandle();
?? ?bool IsExitThread();
?? ?void OneRecvData();?? ??? ??? ??? ?// 一次接收數(shù)據(jù)
?? ?void StartRecvData();?? ??? ??? ?// 開始接收數(shù)據(jù)
?? ?void StopRecvData();?? ??? ??? ?
?? ?void CloseConnect();?? ??? ??? ?// 關閉通訊
private:
?? ?CData m_pData;
};
② socket處理很簡單,其實就是圍繞著收發(fā)
connect和send、recv
至于性能問題,就是如何優(yōu)化在這處理和同步問題了。
程序穩(wěn)定可靠需要靠自身的積累了。
建立通訊代碼。
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連接失敗,請查看網(wǎng)絡是否通訊上、或者端口問題
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();
發(fā)送數(shù)據(jù)文章來源:http://www.zghlxwxcb.cn/news/detail-814078.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-814078.html
到了這里,關于EtherNet/IP開發(fā):C++搭建基礎模塊,EtherNet/IP源代碼的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!