Страница 1 из 8 123 ... ПоследняяПоследняя
Показано с 1 по 10 из 74

Тема: MasterOPC и чтение файла с ПЛК

  1. #1

    По умолчанию MasterOPC и чтение файла с ПЛК

    Добрый день. Пытаюсь разобраться как можно читать opc-сервером файл, созданный не модулем Archiver плк1хх, а программно. На выходе у меня получается файл с содержанием
    Код:
    2000.4.24 3:37:46 #avars=250\r\n2000.4.24 3:37:55 #avars=721\r\n2000.4.24 3:38:4 #avars=740\r\n
    Конфигурацию сервера беру из примера "Конфигурация для чтения архивов контроллеров ОВЕН" с Вашего сайта, чтобы понять принцип работы. Сначала файл имел вид
    Код:
    2000.4.24 3:37:46 #avars=250
    2000.4.24 3:37:55 #avars=721
    2000.4.24 3:38:4 #avars=740
    При этом сервер ругался на неправильный разделитель (использовал '$R$N'). После исправления на '\r\n' в Сообщениях скриптов стало чисто, но при этом тэг выдает значение ноль и COMM_FAILURE. Посмотрел скрипт, вроде как должно читать (только закомментил строки преобразования 16-ти ричного формата).
    Направьте в нужном направлении

    P.S. Запросы и ответы вроде приходят, судя по логу
    Код:
    27-02-2015 15:55:42.452 Node2::Device1:(COM2) Rx: [0102] 01 14 61 60 06 32 30 30 30 2E 34 2E 32 34 20 33 3A 33 37 3A 34 36 20 23 61 76 61 72 73 3D 32 35 30 5C 72 5C 6E 32 30 30 30 2E 34 2E 32 34 20 33 3A 33 37 3A 35 35 20 23 61 76 61 72 73 3D 37 32 31 5C 72 5C 6E 32 30 30 30 2E 34 2E 32 34 20 33 3A 33 38 3A 34 20 23 61 76 61 72 73 3D 37 34 30 5C 72 5C 6E 3F BD  
    27-02-2015 15:55:42.420 Node2::Device1:(COM2) Tx: [0012] 01 14 07 06 00 00 00 00 00 0A 79 23  
    27-02-2015 15:55:32.358 Node2::Device1:(COM2) Rx: [0102] 01 14 61 60 06 32 30 30 30 2E 34 2E 32 34 20 33 3A 33 37 3A 34 36 20 23 61 76 61 72 73 3D 32 35 30 5C 72 5C 6E 32 30 30 30 2E 34 2E 32 34 20 33 3A 33 37 3A 35 35 20 23 61 76 61 72 73 3D 37 32 31 5C 72 5C 6E 32 30 30 30 2E 34 2E 32 34 20 33 3A 33 38 3A 34 20 23 61 76 61 72 73 3D 37 34 30 5C 72 5C 6E 3F BD  
    27-02-2015 15:55:32.311 Node2::Device1:(COM2) Tx: [0012] 01 14 07 06 00 00 00 00 00 0A 79 23
    Последний раз редактировалось energvk; 27.02.2015 в 16:57.

  2. #2

    По умолчанию

    Исходная строка выглядит так:
    2012.09.04 13:19:39 #000=0000
    У вас так:
    2000.4.24 3:37:46 #avars=250

    Вот код анализирующий значения:
    local k,z= string.find(str1, "=" ); --разбираем остальные элементы по символа "="
    if k~=nil and z~=nil then
    local str2=string.sub(str1,z+1); --символ найден - выделяем подстроку со значением
    local str3=string.sub(str1,1,z-1); --символ найден - выделяем подстроку с номером
    elem[str3+1]=str2; --вставляем в таблицу полученный элемент
    else
    То есть по номеру извлеченному из строки определяется куда затем писать значение (в какой тег). У вас же вместо номера значения - имя.
    В принципе можно доработать, вставлять в таблицу не по номеру а просто функцией table.insert
    Спасибо.

  3. #3

    По умолчанию

    Спасибо, понял в чем была проблема.
    А можно в скрипте заменить символы конца строки с '\r\n' на '$R$N'?

  4. #4

    По умолчанию

    В смысле другой разделитель использовать? Можно. Это убираем:
    local n,l= string.find(str, "\r\n" ); --находим разделитель
    if n~=nil and l~=nil then
    server.Message("Некорректный разделитель, чтение невозможно");
    return;
    end;
    Здесь исправляем:
    n,l= string.find(str, "\n\r" ); --находим разделитель
    Спасибо.

  5. #5

    По умолчанию

    Я, в принципе так и представлял. Меня смутило, что архивируя с конфигурации, получаю файл на выходе с текстом типа:
    Код:
    2000.04.23 21:40:36 #000=0000
    
    2000.04.23 21:40:41 #000=0204
    
    2000.04.23 21:44:31 #000=0200
    
    2000.04.23 22:07:51 #000=0100
    Т. е. с разделителем '$r$n'. При этом когда я пытался прочитать свой файл, скрипт ругался на неправильный разделитель. Поставив '\r\n', скрипт затих, но файл стал выглядеть
    Код:
    2000.4.24 3:37:46 #avars=250\r\n2000.4.24 3:37:55 #avars=721\r\n2000.4.24 3:38:4 #avars=740\r\n
    Т.е. строка не переносится.

    Сможет ли скрипт понять символы '$r$n'? Проверить пока не могу.

  6. #6

    По умолчанию

    Какой зададите разделитель, по такому и будет происходить разбор строки.
    Спасибо.

  7. #7

    По умолчанию

    Так, всё равно, что-то не получается. Закомментировал строки:
    Код:
    local n,l= string.find(str, "\r\n" ); --находим разделитель
    if n~=nil and l~=nil then
    server.Message("Некорректный разделитель, чтение невозможно");
    return;
    end;
    Исправил
    Код:
    n,l= string.find(str, "\n\r" );  --находим разделитель
    на
    Код:
    n,l= string.find(str, "$R$N" );  --находим разделитель
    но в ответ - тишина.
    Запросы:
    Код:
    04-03-2015 12:52:12.563 Node1::Device1:(xxx.xxx.xx.xx:502) Rx: [0053] 03 00 00 00 00 2F 01 14 2C 2B 06 3A 33 32 20 23 30 30 30 3D 32 35 36 0D 0A 32 30 30 30 2E 34 2E 32 39 20 30 3A 34 38 3A 34 35 20 23 30 30 30 3D 35 31 32 0D 0A  
    04-03-2015 12:52:12.563 Node1::Device1:(xxx.xxx.xx.xx:502) Tx: [0016] 03 00 00 00 00 0A 01 14 07 06 00 00 00 14 00 0A  
    04-03-2015 12:52:12.563 Node1::Device1:(xxx.xxx.xx.xx:502) Rx: [0111] 02 00 00 00 00 69 01 14 66 65 06 0D 0A 32 30 30 30 2E 34 2E 32 39 20 30 3A 33 38 3A 31 20 23 30 30 30 3D 35 31 32 0D 0A 32 30 30 30 2E 34 2E 32 39 20 30 3A 33 38 3A 31 33 20 23 30 30 30 3D 34 30 30 0D 0A 32 30 30 30 2E 34 2E 32 39 20 30 3A 33 38 3A 32 36 20 23 30 30 30 3D 31 34 35 30 0D 0A 32 30 30 30 2E 34 2E 32 39 20 30 3A 34 38  
    04-03-2015 12:52:12.563 Node1::Device1:(xxx.xxx.xx.xx:502) Tx: [0016] 02 00 00 00 00 0A 01 14 07 06 00 00 00 0A 00 0A  
    04-03-2015 12:52:12.563 Node1::Device1:(xxx.xxx.xx.xx:502) Rx: [0111] 01 00 00 00 00 69 01 14 66 65 06 32 30 30 30 2E 34 2E 32 38 20 34 3A 35 31 3A 31 34 20 23 30 30 30 3D 34 0D 0A 32 30 30 30 2E 34 2E 32 38 20 34 3A 35 31 3A 35 37 20 23 30 30 30 3D 34 0D 0A 32 30 30 30 2E 34 2E 32 38 20 35 3A 31 3A 35 37 20 23 30 30 30 3D 34 0D 0A 32 30 30 30 2E 34 2E 32 38 20 35 3A 37 3A 31 35 20 23 30 30 30 3D 34  
    04-03-2015 12:52:12.547 Node1::Device1:(xxx.xxx.xx.xx:502) Tx: [0016] 01 00 00 00 00 0A 01 14 07 06 00 00 00 00 00 0A
    В сообщениях скриптов пусто, в значениях пусто, качество - COMM_FAILURE

    Сам файл выглядит таким образом:
    Код:
    2000.4.28 4:51:14 #000=4
    2000.4.28 4:51:57 #000=4
    2000.4.28 5:1:57 #000=4
    2000.4.28 5:7:15 #000=4
    2000.4.29 0:38:1 #000=512
    2000.4.29 0:38:13 #000=400
    2000.4.29 0:38:26 #000=1450
    2000.4.29 0:48:32 #000=256
    2000.4.29 0:48:45 #000=512
    Что-то не так я делаю...Только вот,что?
    Последний раз редактировалось energvk; 04.03.2015 в 13:57.

  8. #8

    По умолчанию

    Проверьте - находит ли скрипт данный разделитель.
    Добавьте после строки поиска разделителя команду server.Message и выведите в него переменные позиции символа.
    Спасибо.

  9. #9

    По умолчанию

    На строки
    Код:
    n,l= string.find(str, "$R$N" );  --находим разделитель
    server.Message("$R$N", len);
    получаю, такой ответ
    Код:
    04-03-2015 13:54:57.636 Node1.Device1.Архив:$R$Ntable: 03ED44C0
    Последний раз редактировалось energvk; 04.03.2015 в 14:55.

  10. #10

    По умолчанию

    Что за переменная len? Нужно вывести n и l.
    Спасибо.

Страница 1 из 8 123 ... ПоследняяПоследняя

Похожие темы

  1. Ответов: 16
    Последнее сообщение: 22.01.2019, 09:43
  2. Сохранение/чтение текстового файла
    от Boris_K в разделе Master SCADA 3
    Ответов: 7
    Последнее сообщение: 18.02.2015, 11:30
  3. ПЛК 154. На ПЛК нет файла конфигурации DEFAULT.PRG
    от Юрий Поляков в разделе ПЛК1хх
    Ответов: 12
    Последнее сообщение: 04.04.2012, 23:04
  4. Чтение файла посредством plcIO
    от Назаров Александр в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 26.10.2008, 13:21
  5. !!!чтение данных из файла на компе
    от max в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 20.10.2008, 12:10

Ваши права

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