Страница 3 из 3 ПерваяПервая 123
Показано с 21 по 30 из 30

Тема: Modbus Universal MasterOPC Server demo теряет связь

  1. #21

    По умолчанию

    Как именно выглядит зависание? Скрипт падает (посмотрите в сообщениях скриптов)?
    Какая версия ОРС?
    Спасибо.

  2. #22
    Пользователь
    Регистрация
    09.02.2016
    Адрес
    Тверь
    Сообщений
    28

    По умолчанию

    И так, зашёл я на форум с другого компа, оформление форму другое, вложение скачивается.
    разобрался, как убивать. теперь перезапуск раборает.
    Осталась другая проблема, скрипт глючить по-разному. Если сам заглючил, то перезапуск срабатывает, если usb-server (com->ethernet) помог, то уже никак.

    Скрипт:
    -- Initialization
    function OnInit()


    end
    -- Uninitialization
    function OnClose()
    end
    -- Processing
    function OnBeforeReading()
    local send={};
    local sendmask={"byte","byte","byte","byte","byte","byte ","byte","byte","byte","byte","byte","byte"};
    local dest={};
    local destmask={};
    local bb={};
    local n=0;
    local weight;
    local b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12;


    repeat
    err,dest,len=server.SendAndReceiveDataByMask(0,0,s endmask,send,destmask,12);
    --NoErr,err,dest,len=pcall(server.SendAndReceiveData ByMask,0,0,sendmask,send,destmask,12);

    n=n+1;
    until (err>=0 and len == 12 and dest[1]==02) or n>=3
    if err>=0 then
    b1=dest[3]-48;
    b2=dest[4]-48;
    b3=dest[5]-48;
    b4=dest[6]-48;
    b5=dest[7]-48;
    b6=dest[8]-48;
    if b1>9 or b1<0 then
    b1=0;
    end
    if b2>9 or b2<0 then
    b2=0;
    end
    if b3>9 or b3<0 then
    b3=0;
    end
    if b4>9 or b4<0 then
    b4=0;
    end
    if b5>9 or b5<0 then
    b5=0;
    end
    if b6>9 or b6<0 then
    b6=0;
    end
    bb[1]=b1*100000;
    bb[2]=b2*10000;
    bb[3]=b3*1000;
    bb[4]=b4*100;
    bb[5]=b5*10;
    bb[6]=b6*1;
    weight=bb[1]+bb[2]+bb[3]+bb[4]+bb[5]+bb[6];
    end
    --контроль зависания
    if weight==0 then
    --timeSt=time.TimeStampNow( );
    --w={};
    --w=time.UnpackTime(timeSt );
    --weight=w[6];
    --weight=time.TimeNow( );
    time1=time.TimeNow( );
    w={};
    w=time.UnpackTime(time1 );
    weight=w[6];

    end




    --weight=b1*100000+b2*10000+b3*1000+b4*100+b5*10+b6* 1;
    res=server.WriteTagByRelativeName("Weight",weight, OPC_QUALITY_GOOD);
    --NoErr,res=pcall(server.WriteTagByRelativeName,"Wei ght",weight,OPC_QUALITY_GOOD);
    if err<0 or dest[1]~=02 then
    weight=0;
    res=server.WriteTagByRelativeName("Weight",weight, OPC_QUALITY_BAD);
    --NoErr,res=pcall(server.WriteTagByRelativeName,"Wei ght",weight,OPC_QUALITY_BAD);
    end
    end
    -- Processing
    function OnAfterReading()

    end

    -- Device failure
    function OnError()
    res=server.WriteTagByRelativeName("Weight",weight, OPC_QUALITY_BAD);


    end

    во вложении ошибки. одна, когда свет моргнёт, другая случайно, может через сутки, может два раза за час.
    Изображения Изображения

  3. #23

    По умолчанию

    У вас скрипт падает. Что у вас в 27 строке?
    Разбирайтесь - видимо какие то проверки добавить надо.

    На первый взгляд:
    b1=dest[3]-48;
    b2=dest[4]-48;
    b3=dest[5]-48;
    b4=dest[6]-48;
    b5=dest[7]-48;
    b6=dest[8]-48;

    А если пакет будет не полным и будет только 5 элементов например?
    И где у вас проверка контрольной суммы? Или ее нет?
    Спасибо.

  4. #24
    Пользователь
    Регистрация
    09.02.2016
    Адрес
    Тверь
    Сообщений
    28

    По умолчанию

    ну тут всё четко.
    пробовал запросами, не раззобрался. и с XOR проверкой не разобрался.
    Поставил непрерывную передачу.
    Примерно за день разобрался, как заставить функцию только читать. (справка такаааая кривааая! да и интруция по протоколам тоже!!! Мануалы симинса на английском понятнее и в разы подробнее.)

    в порт летит пакет 12 байт постоянно. начинается на [02], заканчивается на [03].
    Функция сама видит начало и конец.
    но пролетают и отрывки, поэтому в repeat проверяется длина (12шт) и начало (02).
    Как говорил, с XOR не разобрался, поэтому не проверяю. И без него данные летят прекрасно.
    так вот, если в нужном байте прилетает "0", то выглядит он 16х30, отнимаем 10х48, получаем 10х0. Максимум - 10х9.
    Перед умножением проверяю на минимуи и максимум.
    Плохое значение не пролетит.
    Так же бывала ошибка функции записи тэга. не сфоткал. так же наглухо виснет скрипт.
    Вообще даже если все функции засунуть в pcall, всё равно скрипт зависает.
    всегда так зависает, что скада думает - всё норм. пришлось проверку делать.
    Последний раз редактировалось Alexlyu; 26.05.2021 в 15:12.

  5. #25

    По умолчанию

    У вас скрипт не зависает - происходит его падение, и он даже выдает строчку в которой это падение происходит.
    Смотрите что вы делаете в этой строчке
    Спасибо.

  6. #26
    Пользователь
    Регистрация
    09.02.2016
    Адрес
    Тверь
    Сообщений
    28

    По умолчанию

    неделю смотрю.
    добавляю проверки.
    ничего криминального не делаю.
    максимально просто всё, я ж выложил то, что выстрадал.
    Хорошо, что с перезапуском всего сервера разобрался, помогает чаще всего.
    Но почему на работает "реинициализация узла при ошбке"? и почему сервер вообще сам не пытается перезапустить скрипт. бред же.
    лучше б доусрачки перезапускал. И все были бы счастливы.

  7. #27

    По умолчанию

    Лог вам выдает ошибку - в какой строчке падает. В том что на скриншотах - 27 строка.
    Что у вас там?
    Спасибо.

  8. #28
    Пользователь
    Регистрация
    09.02.2016
    Адрес
    Тверь
    Сообщений
    28

    По умолчанию

    я то думал, скрины помуогт в орпеделении ошибки. нагуглить не удалось.
    когда скрипт падает сам, то ругается на эти
    строчки::

    b1=dest[3]-48;
    b2=dest[4]-48;
    b3=dest[5]-48;
    b4=dest[6]-48;
    b5=dest[7]-48;
    b6=dest[8]-48;


    Если скрипту помогают падать, то на строчку с функцией записи тэга по имени. (это когда отваливается COM порт)

  9. #29

    По умолчанию

    сделайте перед этим кодом:
    if table.maxn(dest)~=8 then

    end;

    Выйдите из скрипта или снова выполните запрос
    Спасибо.

  10. #30
    Пользователь
    Регистрация
    09.02.2016
    Адрес
    Тверь
    Сообщений
    28

    По умолчанию

    Цитата Сообщение от SCADAMaster Посмотреть сообщение
    сделайте перед этим кодом:
    if table.maxn(dest)~=8 then

    end;

    Выйдите из скрипта или снова выполните запрос
    Спасибо, помогло! (только 12 элементов поставил)
    С тех пор была пара перезапусков сервера, и по нескольку сообщений за день от скады об ошибке переменной.
    Раньше сообщений не было, видимо скрипт теперь не падает, а отсылает плохое качество.
    Результатом я доволен, система работает без вмешательства.

Страница 3 из 3 ПерваяПервая 123

Похожие темы

  1. Modbus Universal MasterOPC Server в режиме slave
    от smk1635 в разделе Master SCADA 3
    Ответов: 25
    Последнее сообщение: 31.01.2023, 23:49
  2. Ответов: 8
    Последнее сообщение: 28.12.2014, 23:07
  3. Modbus Universal MasterOPC Server период опроса
    от hawk в разделе Master SCADA 3
    Ответов: 4
    Последнее сообщение: 23.10.2012, 21:09
  4. Подключение ПЛК-100 к MasterOPC Universal Modbus Server
    от Слава1 в разделе Master SCADA 3
    Ответов: 14
    Последнее сообщение: 08.06.2012, 00:34
  5. Modbus Universal MasterOPC Server и ПЛК мастер
    от smk1635 в разделе Master SCADA 3
    Ответов: 7
    Последнее сообщение: 13.09.2011, 22:22

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •