Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何向libnodave测试程序(testISO_TCP simplified)添加代码,以防止读取例程崩溃? 我首先要说我是一个没有C++经验的大学生。你听对了多少次了?我正在使用libnodave库中的测试程序testISO_TCP(简化版)。该程序在连接至seimens 300 PLC时,对标志值和数据块进行简单读取。程序本身不会出现任何错误。我正试图做的是希望在这个程序中添加一些代码,以保护读操作不受崩溃的影响。让我解释清楚一点。比如说,我在代码中实现了很多读取。到目前为止,只有两次阅读。最终,我将通过更多的读取来运行这段代码。现在,假设我正在运行测试程序,由于某种原因,我失去了与PLC的连接。我想让程序做两件事中的一件:1)一旦连接丢失,进行一定次数的重试连接,当尝试次数用完时,退出。或2)以某种方式继续从PLC读取数据,直到全部完成_C_Plc - Fatal编程技术网

如何向libnodave测试程序(testISO_TCP simplified)添加代码,以防止读取例程崩溃? 我首先要说我是一个没有C++经验的大学生。你听对了多少次了?我正在使用libnodave库中的测试程序testISO_TCP(简化版)。该程序在连接至seimens 300 PLC时,对标志值和数据块进行简单读取。程序本身不会出现任何错误。我正试图做的是希望在这个程序中添加一些代码,以保护读操作不受崩溃的影响。让我解释清楚一点。比如说,我在代码中实现了很多读取。到目前为止,只有两次阅读。最终,我将通过更多的读取来运行这段代码。现在,假设我正在运行测试程序,由于某种原因,我失去了与PLC的连接。我想让程序做两件事中的一件:1)一旦连接丢失,进行一定次数的重试连接,当尝试次数用完时,退出。或2)以某种方式继续从PLC读取数据,直到全部完成

如何向libnodave测试程序(testISO_TCP simplified)添加代码,以防止读取例程崩溃? 我首先要说我是一个没有C++经验的大学生。你听对了多少次了?我正在使用libnodave库中的测试程序testISO_TCP(简化版)。该程序在连接至seimens 300 PLC时,对标志值和数据块进行简单读取。程序本身不会出现任何错误。我正试图做的是希望在这个程序中添加一些代码,以保护读操作不受崩溃的影响。让我解释清楚一点。比如说,我在代码中实现了很多读取。到目前为止,只有两次阅读。最终,我将通过更多的读取来运行这段代码。现在,假设我正在运行测试程序,由于某种原因,我失去了与PLC的连接。我想让程序做两件事中的一件:1)一旦连接丢失,进行一定次数的重试连接,当尝试次数用完时,退出。或2)以某种方式继续从PLC读取数据,直到全部完成,c,plc,C,Plc,我希望这是足够的信息得到一些帮助。我将发布代码,我一直在寻找这么长时间没有任何想法如何有效地做到这一点。提前感谢大家 #define PLAY_WITH_KEEPALIVE #include <stdlib.h> #include <stdio.h> #include "nodavesimple.h" #include "openSocket.h" #ifdef PLAY_WITH_KEEPALIVE #include <winsock.h> #endif

我希望这是足够的信息得到一些帮助。我将发布代码,我一直在寻找这么长时间没有任何想法如何有效地做到这一点。提前感谢大家

#define PLAY_WITH_KEEPALIVE
#include <stdlib.h>
#include <stdio.h>
#include "nodavesimple.h"
#include "openSocket.h"


#ifdef PLAY_WITH_KEEPALIVE
#include <winsock.h>
#endif


int main(int argc, char **argv) {
    int a,b,c,res, doRun, doStop, doRead, doreadFlag, useProtocol, useSlot;
#ifdef PLAY_WITH_KEEPALIVE      
    int opt;
#endif    
    float d;
    daveInterface * di;
    daveConnection * dc;
    _daveOSserialType fds;
    doRun=0;
    doStop=0;
    doRead=0;
    doreadFlag=0;
    useProtocol=daveProtoISOTCP;
    useSlot=2;


 fds.rfd=openSocket(102, argv[1]);
    #ifdef PLAY_WITH_KEEPALIVE
    errno=0;    
    opt=1;
   //res=setsockopt(fds.rfd, SOL_SOCKET, SO_KEEPALIVE, &opt, 4);
   //LOG3("setsockopt %s %d\n", strerror(errno),res);
    #endif
 fds.wfd=fds.rfd;

    if (fds.rfd>0) 
        { 
        di =daveNewInterface(fds,"IF1",0, daveProtoISOTCP, daveSpeed187k);
        daveSetTimeout(di,5000000);
        dc =daveNewConnection(di,2,0, 2);  // insert your rack and slot here



            if (0==daveConnectPLC(dc)) 
                {
                    printf("Connected.\n");

                res=daveReadBytes(dc,daveFlags,0,0,16,NULL);
                if (0==res)  
                { 
                        a=daveGetU32(dc);
                        b=daveGetU32(dc);
                        c=daveGetU32(dc);
                        d=daveGetFloat(dc);
                    printf("FD0: %d\n",a);
                    printf("FD4: %d\n",b);
                    printf("FD8: %d\n",c);
                    printf("FD12: %f\n",d);
                }//end 0==res

                }//end daveConnectPLC


            else 

            {
        printf("Couldn't connect to PLC.\n Please make sure you use the -2 option with a CP243 but not with CPs 343 or 443.\n");    
        //closeSocket(fds.rfd);
        //return -2;
            }

    }//end fds.rfd



    fds.rfd=openSocket(102, argv[1]);
    fds.wfd=fds.rfd;

    if (fds.rfd>0) 
        { 
        di =daveNewInterface(fds,"IF1",0, daveProtoISOTCP, daveSpeed187k);
        daveSetTimeout(di,5000000);
        dc =daveNewConnection(di,2,0, 2);  // insert your rack and slot here


            if (0==daveConnectPLC(dc)) 
                {
                    printf("Connected.\n");

                res=daveReadBytes(dc,daveDB,1,0,64,NULL);
                if (0==res) 
                { 

                    a=daveGetU16(dc);
                    printf("DB1:DW0: %d\n",a);
                    a=daveGetU16(dc);
                    printf("DB1:DW1: %d\n...\n",a);
                    a=daveGetU16At(dc,62);
                    printf("DB1:DW32: %d\n",a);


                }//end 0==res

                    return 0;

                }//end daveConnectPLC
            else 

            {
        printf("Couldn't connect to PLC.\n Please make sure you use the -2 option with a CP243 but not with CPs 343 or 443.\n");    
        closeSocket(fds.rfd);
        return -2;
            }

    }//end fds.rfd






    else 
    {
    printf("Couldn't open TCP port. \nPlease make sure a CP is connected and the IP address is ok. \n");    
        return -1;
    }    



}// end main
#使用_KEEPALIVE定义PLAY_
#包括
#包括
#包括“nodavesimple.h”
#包括“openSocket.h”
#如果使用KEEPALIVE播放
#包括
#恩迪夫
int main(int argc,字符**argv){
int a、b、c、res、doRun、doStop、doRead、doreadFlag、useProtocol、USESTLOT;
#如果使用KEEPALIVE播放
int-opt;
#恩迪夫
浮动d;
daveInterface*di;
daveConnection*dc;
_daveos型fds;
多伦=0;
doStop=0;
多里德=0;
doreadFlag=0;
useProtocol=DaveProtoIsToCp;
useSlot=2;
rfd=openSocket(102,argv[1]);
#如果使用KEEPALIVE播放
errno=0;
opt=1;
//res=setsockopt(fds.rfd、SOL_SOCKET、SO_KEEPALIVE和opt,4);
//日志3(“设置锁选项%s%d\n”,strerror(errno),res);
#恩迪夫
fds.wfd=fds.rfd;
如果(fds.rfd>0)
{ 
di=daveNewInterface(fds,“IF1”,0,daveProtoISOTCP,daveSpeed187k);
daveSetTimeout(di,5000000);
dc=daveNewConnection(di,2,0,2);//在此处插入机架和插槽
如果(0==daveConnectPLC(dc))
{
printf(“已连接。\n”);
res=daveReadBytes(dc,daveFlags,0,0,16,NULL);
如果(0==res)
{ 
a=daveGetU32(直流电);
b=daveGetU32(直流电);
c=daveGetU32(直流);
d=daveGetFloat(dc);
printf(“FD0:%d\n”,a);
printf(“FD4:%d\n”,b);
printf(“FD8:%d\n”,c);
printf(“FD12:%f\n”,d);
}//结束0==res
}//结束daveConnectPLC
其他的
{
printf(“无法连接到PLC。\n请确保将-2选项与CP243一起使用,而不是与CPs 343或443一起使用。\n”);
//闭合插座(fds.rfd);
//返回-2;
}
}//结束fds.rfd
rfd=openSocket(102,argv[1]);
fds.wfd=fds.rfd;
如果(fds.rfd>0)
{ 
di=daveNewInterface(fds,“IF1”,0,daveProtoISOTCP,daveSpeed187k);
daveSetTimeout(di,5000000);
dc=daveNewConnection(di,2,0,2);//在此处插入机架和插槽
如果(0==daveConnectPLC(dc))
{
printf(“已连接。\n”);
res=daveReadBytes(dc,daveDB,1,0,64,NULL);
如果(0==res)
{ 
a=daveGetU16(直流电);
printf(“DB1:DW0:%d\n”,a);
a=daveGetU16(直流电);
printf(“DB1:DW1:%d\n..\n”,a);
a=daveGetU16At(dc,62);
printf(“DB1:DW32:%d\n”,a);
}//结束0==res
返回0;
}//结束daveConnectPLC
其他的
{
printf(“无法连接到PLC。\n请确保将-2选项与CP243一起使用,而不是与CPs 343或443一起使用。\n”);
闭合插座(fds.rfd);
返回-2;
}
}//结束fds.rfd
其他的
{
printf(“无法打开TCP端口。\n请确保CP已连接且IP地址正常。\n”);
返回-1;
}    
}//端干管

所有用于检测通信中断的信息都在文档中。

您必须检查daveReadBytes函数的返回值。 如果不为零,则表示出现问题,您可以使用daveStrerror函数获取正确的错误消息:

printf(“错误:%s\n”,错误(res))


在此之后,您可以决定要么重试读取,要么断开连接(使用closeSocket(…),然后从头创建一个新连接。检查文档中有哪些错误代码。有些错误无法通过重试来解决(例如,因为您尝试读取不存在的数据块)。

我有一个循环,尝试连接3次,如果失败则正常退出 您可以编写一些其他代码,首先检查连接是否正常,PLC是否正常。
通常情况下,如果您尝试连接到一个IP地址,但该地址不存在esond;它将挂在那里并占用资源…

我也是一名新程序员。但我想说的是。首先,我们必须区分
TCP/IP
ethernet
ISO_-TCP
的连接。
openSocket()
函数用于连接到给定端口/服务(102 ISO_TCP)中的远程IP地址。下一步调用函数
daveNewInterface()
,它将初始化特定接口,以便与PLC进行连接。在此之后,函数
daveNewConnection()
尝试在给定的MPI地址以及非常重要的给定机架和插槽上打开连接