Как я могу добавить код в тестовую программу libnodave (testiso TCP simplified), который защищает процедуру чтения от сбоя?



Я начну с того, что скажу, что я студент колледжа с небольшим опытом работы на c++. Сколько раз вы слышали это правильно? Я работаю с тестовой программой testISO_TCP (упрощенная версия) из библиотеки libnodave. Эта программа выполняет простое считывание значений флагов и блоков данных, когда она подключена к ПЛК seimens 300. Программа не вызывает никаких ошибок как таковых. То, что я пытаюсь сделать, - это, надеюсь, добавить в эту программу некоторый код, который защитит чтение от любого сбоя. Позволь я объясню немного лучше. Скажем, например, у меня есть много чтений, реализованных в коде. На данный момент есть только два чтения. В конце концов я буду запускать этот код с большим количеством других чтений. Теперь скажите, что я запускаю тестовую программу и по какой-то причине теряю связь с ПЛК. Я хотел бы, чтобы программа сделала одну из двух вещей: 1) Как только соединение потеряно, повторите попытку подключения определенное количество раз, а когда она закончится, закройте ее. или 2) как-то продолжать читать с ПЛК пока они все не закончат.



Я надеюсь, что этой информации достаточно, чтобы получить некоторую помощь. Я опубликую код, который я так долго искал, не имея ни малейшего представления о том, как это сделать эффективно. Спасибо всем заранее.

#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 %dn", 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: %dn",a);
printf("FD4: %dn",b);
printf("FD8: %dn",c);
printf("FD12: %fn",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: %dn",a);
a=daveGetU16(dc);
printf("DB1:DW1: %dn...n",a);
a=daveGetU16At(dc,62);
printf("DB1:DW32: %dn",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
567   4  

4 ответов:

Необходимо проверить возвращаемое значение функции daveReadBytes. Если он не равен нулю, что-то пошло не так, и вы можете использовать функцию daveStrerror для получения правильного сообщения об ошибке:

printf ("error: %s\n", daveStrerror(res));

После этого вы можете решить, просто повторить чтение или отключить (с closeSocket(...)) а затем создайте новое соединение с самого начала. Проверьте документацию о том, какие коды ошибок существуют. Некоторые ошибки не могут быть устранены повторной попыткой (например, потому что вы пытаетесь читать блок данных, который не существует).

У меня есть цикл, который пытается подключиться 3 раза и изящно завершается, если это не удается Вы можете написать какой-нибудь другой код, чтобы сначала проверить, работает ли соединение, а также ПЛК. Обычно, если вы пытаетесь подключиться к IP-адресу, который не соответствует esond; он будет висеть там и связывать ресурсы...

Я тоже новый программист.Но хочу сказать именно это. Сначала мы должны различать связь TCP/IP с картой ethernet ISO_TCP. Функция openSocket() выполняет подключение к удаленному IP-адресу в данном порту / службе (102 ISO_TCP). При следующем вызове функции daveNewInterface(), она инициализирует определенный интерфейс для выполнения подключения к ПЛК. После этого функция daveNewConnection() пытается открыть соединение на заданном MPI-адресе и, что очень важно, на заданной стойке и слоте. Если эта функция возвращает значение 0, оно вызовет функцию daveConnectPLC() для подключения к ПЛК. В этот момент он установил соединение ethernet, а также соединение PLC. Теперь вы можете использовать все функции из libnodave библиотека для чтения или записи данных, остановки или запуска ПЛК и многое другое.

В фактически упрощенном коде TCP_ISO нет функции для отключения адаптера или закрытия соединения с ПЛК, в вашем коде есть функция closeSocket(), а также функция, которая возвращает -2. Найдите, в какой строке код прерывается, вводя, например, журнал после каждой функции, чтобы увидеть возвращаемые значения.

Вся информация для обнаружения потери связи находится в документации.

Comments

    Ничего не найдено.