[欧姆龙] 欧姆龙NJ Sockets通讯

[复制链接]
查看40715 | 回复0 | 2024-3-19 14:53:07 | 显示全部楼层 |阅读模式
(一)区分

PLC作为服务器(接受Accept):只要开放端口号(客户端会自己来连接对应的端口)

PLC作为 客户端(连接 Connect)开放自己的端口并且需要知道服务器的IP与端口号

(二)通讯需要用到的数据处理指令





















(三) TCP Scokets通讯



































Socket功能块

IF mLink = TRUE THEN

                Link := mLink;

ELSE

                Link:=FALSE;

END_IF;

SendStr  :=mSendStr;//要发送的数据

count     :=LEN(SendStr);   //数据 的长度

ToAryByte(SendStr,_LOW_HIGH,SendSocketDat[0]);//把要 发送的数据传送到SendSocketDat数组中,从低到高

sTon( IN:=(mLinkDone = TRUE),PT :=T#100ms,    Q   =>sTonQ);//  mLinkDone:=(SktTCPAccept_instance.Done  = TRUE) OR   (SktTCPConnect_instance.Done = TRUE);

IF mServerOrClient = 'Server'      THEN

                                // 建立服务器

         SktTCPAccept_instance(

                                                              Execute                                  :=(Link=TRUE) AND  (_Eip_EtnOnlineSta=TRUE),

                                                              SrcTcpPort                            :=mPort,              // 本机 TCP 端口编号

                                                               TimeOut                                 :=mTimeOut,           // 超时时间

                                                              Socket                                     =>WkSocket            // Socket

                                                                                      );            

ELSIF mServerOrClient = 'Client' THEN

                                // 建立客户端

                                SktTCPConnect_instance(

                                                                                  Execute :=(Link=TRUE) AND  (_Eip_EtnOnlineSta=TRUE),

                                                                                    //SrcTcpPort :=0,   // 本机端口编号 自动分配

                                                                                    DstAdr :=mIp,             // 服务器 IP 地址

                                                                                    DstTcpPort :=mPort,            // 服务器 TCP 端口编号

                                                                                   Socket =>WkSocket

                                                                                  );                                             // Socket

END_IF;

IF  (mLinkDone = TRUE)  THEN//连接上后,开始动作

                                //状态查询

                                SktGetTCPStatus_instance(

                                                                                Execute                  :=(SktGetTCPStatus_instance.Done = FALSE) AND sTonQ,

                                                                                Socket                                    :=WkSocket,

                                                                                TcpStatus                              =>TcpStatus,

                                                                                DatRcvFlag           =>DatRcvFlag

                                                                               );

                              

                                // 接收数据

                                SktTCPRcv_instance(

                                                                                Execute         :=(SktGetTCPStatus_instance.Done = TRUE) ,//接收数据是实时的,只要通信没有问题

                                                                                Socket            :=WkSocket, // Socket

                                                                                TimeOut          :=mTimeOut, // 超时时间

                                                                                Size              :=UINT#2000, // 接收数据大小

                                                                               RcvDat            :=RcvSocketDat[0],

                                                                                RcvSize        =>mRcvSize

                                                                            );

                              

                                // 发送请求

                                SktTCPSend_instance(

                                                                                     Execute      :=mSendStart,//发送数据需要触发

                                                                                     Socket      :=WkSocket,        // Socket

                                                                                     SendDat        :=SendSocketDat[0],     // 发送数据

                                                                                      Size          :=count         // 发送数据大小

                                                                                );            

                              

                                // 清除接收缓存

                                SktClearBuf_instance(

                                                                            Execute :=(SktClearBuf_instance.Done = FALSE),

                                                                            Socket :=WkSocket

                                                                       ); // Socket

                                                                                                                                                                              

                                // 关闭请求

                                SktClose_instance(

                                                                            Execute :=mClose,

                                                                            ocket :=WkSocket

                                                                        );                                                                                                                                                                                                                                                                                            

END_IF;

AryByteTo(RcvSocketDat[0],mRcvSize,_LOW_HIGH,mReceiveStr);//把接收到的数据数组转换成多个字节(连续寄存器中)

mLinkDone:=(SktTCPAccept_instance.Done  = TRUE) OR   (SktTCPConnect_instance.Done = TRUE);

IF (SktTCPSend_instance.Done = TRUE) THEN//数据发送完成后,复位发送完成信号

                mSendDone :=TRUE;

ELSE

                mSendDone :=FALSE;

END_IF;

IF (SktTCPRcv_instance.Done = TRUE) THEN

                mReceDone                           :=TRUE;

ELSE

                mReceDone                           :=FALSE;


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则