Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 14

Тема: МСД-200. Сбор архивных данных в Scada систему с помощью скрипта.

  1. #1

    По умолчанию МСД-200. Сбор архивных данных в Scada систему с помощью скрипта.

    Добрый день!

    Исходные данные:
    - Овен МСД-200
    - MasterOPC Modbus server 4.2.37
    - MasterScada 3.10

    Что хочу:
    - При пропадании связи с MasterScada необходимо автоматическое "подтягивание" накопленных в МСД-200 значений при возобновлении связи. Насколько это реально?

    Что я уже знаю, но не понимаю как сделать:
    - в МСД-200 есть пользовательская функция 71 (0х47) с помощью которой можно обращаться к подфункции чтения файлов из прибора (к примеру, ReadFileFirst).
    - Данные запросы я должен писать в скриптах MasterOPC Modbus server.


    Возможно увидеть пример такого запроса?
    Последний раз редактировалось Gorillaz; 02.07.2019 в 14:09.

  2. #2

    По умолчанию

    В инструкции к прибору дана структура запроса (фото прикреплено), где есть "длина параметров в байтах". Какие параметры передаются? Где в этом запросе вызывать адрес подфункции? Контрольная сумма ZZ. Что значит ZZ? Структура запроса.png

    Начудил вот такой вот скриптик (пока не рабочий, пытаюсь прочитать хотя бы состояние карты памяти(подфукция 0х06)):


    -- Initialization
    function OnInit()
    end
    -- Uninitialization
    function OnClose()
    end
    -- Processing
    function OnRead()
    --Addr=server.GetCurrentDeviceAddress( );
    --server.Message(Addr);
    server.Message(Query());
    end

    function Query()
    local send={};
    local Addr=server.GetCurrentDeviceAddress( );
    table.insert(send, Addr);
    table.insert(send, 0x47);
    table.insert(send, 0x06);
    local sendmask={"byte","byte"};
    local dest={};
    local destmask={"byte","byte","byte"};
    dest=server.SendAndReceiveDataByMask(2,3,sendmask, send, destmask, 200);
    end
    Последний раз редактировалось Gorillaz; 02.07.2019 в 16:43.

  3. #3

    По умолчанию МСД-200. Сбор архивных данных в Scada систему с помощью скрипта.

    Добрый день!

    Исходные данные:
    - Овен МСД-200
    - MasterOPC Modbus server 4.2.37
    - MasterScada 3.10

    Что хочу сделать:
    - При пропадании связи с MasterScada необходимо автоматическое "подтягивание" накопленных в МСД-200 значений при возобновлении связи. Насколько это реально?

    Я узнал, что:
    - в МСД-200 есть пользовательская функция 71 (0х47) с помощью которой можно обращаться к подфункции чтения файлов из прибора (к примеру, ReadFileFirst(0x03)).
    - Данные запросы я должен писать в скриптах MasterOPC Modbus server.


    Попытался прочитать хотя бы статус карты памяти, но скрипт не работает.

    -- Initialization
    function OnInit()
    end
    -- Uninitialization
    function OnClose()
    end
    -- Processing
    function OnRead()
    local send={};
    local Addr=server.GetCurrentDeviceAddress( );
    table.insert(send, Addr);
    table.insert(send, 0x11);
    table.insert(send, 0x06); -- опрос состояния SD карты
    local sendmask={"byte","byte","byte"};
    local dest={};
    local destmask={"byte","byte","byte","byte"};
    dest=server.SendAndReceiveDataByMask(2,3,sendmask, send, destmask, 200);
    server.Message(dest[3]);
    end

    Инструкции:
    Форма запроса.jpg
    Подфункции.jpg

  4. #4

    По умолчанию

    На первый взгляд в скрипте все нормально. Смотрите что именно не работает - вкладка Запросы, смотрите что посылается в порт.
    Включите запись лога - смотрите лог.
    Спасибо.

  5. #5

    По умолчанию

    Выводится следующий лог:
    04-07-2019 12:47:49.577 Tag1:Node1.Device1.Tag1 >> (node)Node1device)Device1teg)Tag1OnRead)::SendAndReceiveDataByMask : количество параметров в таблице меньше указанного в параметре Count
    stack traceback:
    [C]: at 0x0063a91c
    [C]: in function 'SendAndReceiveDataByMask'
    [string "--[[(R)Node1.Device1.Tag1]]..."]:21: in function <[string "--[[(R)Node1.Device1.Tag1]]..."]:12>

  6. #6

    По умолчанию

    Попробуйте так
    err,dest,len=server.SendAndReceiveDataByMask(2,tab le.maxn(send),sendmask, send, destmask, 200);
    И посмотрите вот эту документацию ну и справку тоже
    Спасибо.

  7. #7

    По умолчанию

    Переделал скрипт:


    -- Initialization
    function OnInit()
    end
    -- Uninitialization
    function OnClose()
    end
    -- Processing
    function OnRead()
    local send={};
    local Addr=server.GetCurrentDeviceAddress( );
    table.insert(send, Addr);
    table.insert(send, 0x47);
    table.insert(send, 0x06); -- опрос состояния SD карты
    local sendmask={"byte","byte","byte",0};
    local dest={};
    local destmask={"byte","byte","byte","byte","byte"};
    dest=server.SendAndReceiveDataByMask(2,table.maxn( send),sendmask, send, destmask, 200);

    server.Message(dest);
    end


    Функция возвращает -1, что значит ошибка связи, как я понял. Документ и справку я штудировал, у меня полное ощущение, что я в неверной форме создаю маски запроса и ответа, но документация к прибору не дает мне понимания как это сделать правильно.

  8. #8

    По умолчанию

    local sendmask={"byte","byte","byte",0};
    А что тут 0 в конце делает?
    Смотрите какие запросы отправляет ОРС в порт и сравнивайте с тем что должно.
    Спасибо.

  9. #9

    По умолчанию

    Решил воспользоваться более простой функцией 0х11 (узнать марку прибора и версию ПО), в ответе на запрос приходит правильная посылка!!! 4D 53 44 2D 32 30 30 20 56 31 2E 35 31 - эта штучка и есть наименование прибора.Но вот вернуть в читаемом виде с помощью функции SendAndReceiveDataByMask не выходит. Функция возвращает 16 (адрес прибора такой)
    04-07-2019 16:54:43.366 Node1.Device1.Tag1:16 .
    Сам скрипт:
    -- Processing
    function OnRead()
    local send={};
    local Addr=server.GetCurrentDeviceAddress( );
    table.insert(send, Addr);
    table.insert(send, 0x11);
    --table.insert(send, 0x06); -- опрос состояния SD карты
    local sendmask={"byte","byte"};
    local dest={};
    local destmask={"byte","byte","byte","byte"};
    dest=server.SendAndReceiveDataByMask(2,table.maxn( send),sendmask, send, destmask, 200);

    server.Message(dest);
    end



    04-07-2019 16:49:37.914 Node1:evice1COM6) Rx: [0018] 10 11 0D 4D 53 44 2D 32 30 30 20 56 31 2E 35 31 1E BE
    04-07-2019 16:49:37.865 Node1:evice1COM6) Tx: [0004] 10 11 CC 7C

    Не подскажите, что я не так сделал?

  10. #10

    По умолчанию

    Так а что вы вообще сделали? Вот у вас маска запроса:
    local destmask={"byte","byte","byte","byte"};
    А вот ваш ответ:
    Rx: [0018] 10 11 0D 4D 53 44 2D 32 30 30 20 56 31 2E 35 31 1E BE
    И как он должен на нее наложиться?
    Прочитайте в документации и справке как работает маска, и как ее нужно прописывать.
    Спасибо.

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Ответов: 10
    Последнее сообщение: 22.03.2017, 08:57
  2. Хранение архивных данных
    от Vitamin в разделе Master SCADA 3
    Ответов: 3
    Последнее сообщение: 29.01.2015, 08:12
  3. Ответов: 2
    Последнее сообщение: 21.03.2014, 18:11
  4. Ответов: 19
    Последнее сообщение: 21.03.2013, 08:41

Ваши права

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