網(wǎng)站制作怎么學去哪學電商運營培訓哪個機構好
這里是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ù)