VitaliyAT

Ответы в темах

Просмотр 15 сообщений - с 16 по 30 (из 44 всего)
  • Автор
    Записи
  • VitaliyAT
    Участник

    Видео моих действий
    Залил НЕобщедоступное (а только по ссылке) видео моих действий. Удаление канала локального ПК (может только в моём случаи) приводит к ошибке сервера.

    • Ответ изменён 9 лет, 3 месяца назад пользователем VitaliyAT.
    VitaliyAT
    Участник

    Это связанно с вот этим каналом и переменными?:

    Я их активировал и вроде пошло.
    На видео — не рассказано о таком. А надо бы.

    VitaliyAT
    Участник

    зато я её пихал во входные — для себя пометку оставил ))) Вот про формулу Михаила ничего не скажу пока. Это вообще какой язык? С?

    VitaliyAT
    Участник

    Для себя нашёл промежуточное [РЕШЕНИЕ] по приёму-передачи float (он же REAL = 32bit). Для меня это даже лучше, так как и планировалось работать Float переменными (требование заказчика ибо).
    НО! На будущее: Вопрос передачи-приёма Double (он же LREAL в ПЛК BnR = 64bit) остаётся не решённым.
    1) Заносим формулу от manjey73 в формулы (немного её изменив по части порядка присвоения). Главное нам из неё получить упаковку Double в Float:

    public double fRevers (int rev)
    {
    float q = Convert.ToSingle(CmdVal);
    byte[] f = new byte[4];
    byte[] o = new byte[4];
    f = BitConverter.GetBytes(q);
    Array.Copy(f,0,o,0,4);
    if (rev == 1234)
    {
    Array.Copy(f, 0, o, 0, 1);
    Array.Copy(f, 1, o, 1, 1);
    Array.Copy(f, 2, o, 2, 1);
    Array.Copy(f, 3, o, 3, 1);
    }
    Array.Resize(ref o, 8);
    Double ou = BitConverter.ToDouble(o,0);
    return ou;
    }

    2) Затем её вызываем в канале УПРАВЛЕНИЯ (а не входном), вот так:

    3) В СКАДА-коммуникаторе настраиваем канал управления так. Главное чтоб «кол-во элементов быоло 2»:

    4) А входящий канал так. Главное что float и порядок 3210 (его если менять, то в паре с формулой из п.1):

    5) Далее, дополнительные действия: в ПЛК организовать расшифровку пары байт как Float. На ST в среде B+R Automation Studio это выглядит так:

    FUNCTION MBT2Real
    
    	brsmemcpy((pReal+0), (pMBT+1), 1);
    	brsmemcpy((pReal+1), (pMBT+2), 1);
    	brsmemcpy((pReal+2), (pMBT+3), 1);
    	brsmemcpy((pReal+3), (pMBT+4), 1);
    
    	MBT2Real := 0;
    	RETURN;
    END_FUNCTION

    Где: pReal — это адрес элемента массива Real (Float) чисел, с которым потом работать логике ПЛК; pMBT — массив МодБАСа куда СКАДА скидывает значение (соответственно это Holding Registers).

    • Ответ изменён 9 лет, 3 месяца назад пользователем VitaliyAT.
    • Ответ изменён 9 лет, 3 месяца назад пользователем VitaliyAT.
    VitaliyAT
    Участник

    manjey73, мы про это говорим?:

    Если да то при 4х приходит:

    А при 2х (как на скрине выше):

    Можно констатировать что если речь об этом, то просто снижение с 4 до 2х байт даёт ошибку, так как просто приходит 2 байта, а не перевод Double в Float и последующая его отправка. Может как-то с помощью формул можно в начале перегнать Double в Float , затем запихнуть его в 2 первых байта и отправить? Решит ли это вопрос чтения СКАДА-коммуникатором или породит ещё кучку вопросов?

    • Ответ изменён 9 лет, 3 месяца назад пользователем VitaliyAT.
    • Ответ изменён 9 лет, 3 месяца назад пользователем VitaliyAT.
    VitaliyAT
    Участник

    Тут уже 2 темы параллельно пошло, одна как оно работает без формулы и потом как работает формула:
    Начнём с того как оно работает без формулы:
    1. Требуется отправить значение …
    123,456
    2. В прибор необходимо записать байты … с помощью функции Модбас …
    Просто — да. )) ибо какие байты, кроме как соответствующие — не знаю. И да — по МодБАС.
    3. На данный момент выполнены следующие настройки …
    Создан канал для чтения холдинг регистра, при этом на скрине показан сразу порядок байт, но и без него результат примерно такой же:

    Создан канал для записи холдинг регистра

    настроенны таблицы и переданы в веб-морду:

    отправляю с неё значение (на тёмном воне можно наблюдать мильёнымильярдов — это если не трогать порядок чтения байт):

    ПЛК получает значение и верно расшифровывает его в пордке байт 10325476

    А коммуникатор видит 0:

    4. В прибор отправляется …
    123,456
    5. Проблема заключается в следующем: …
    СКАДА-коммуникатор неверно читает Дабл переменные записанные самой СКАДОЙ.

    • Ответ изменён 9 лет, 3 месяца назад пользователем VitaliyAT.
    • Ответ изменён 9 лет, 3 месяца назад пользователем VitaliyAT.
    VitaliyAT
    Участник

    Странно, очень странно… Холдинг регистр пишет одним порядком, а читает другим. При этом 10325476 — раскодирует не верно. Какая последовательность байт должна быть при чтении (и вообще зависит ли от неё что-либо, потому как это уже просто перебор, а не логический подбор — логически это 10325476)? Вот тут:

    VitaliyAT
    Участник

    исходя из настроек Коммуникатора отправляется 2, 4 байта в прибор

    Нет там таких настроек к сожалению… Получается нам хоть с формулами, хоть без всё равно кормить ПЛК даблами?

    С даблами своя проблема при чтении СКАДА-коммуникатором:
    Ввожу в СКАДЕ (В таблице значение 12.34) В ПЛК она приходит и расшифровывается нормально. А в СКАДА-комуникаторе читает 0, при настройке читать как double, и миллионы-миллардов, если попросить прочитать как real (то есть чтение как действие есть).

    • Ответ изменён 9 лет, 3 месяца назад пользователем VitaliyAT.
    VitaliyAT
    Участник

    Сдаётся мне сама формула не передаёт число в real, а просто меняет байты местами.

    VitaliyAT
    Участник

    Добавил вашу формулу:

    double SwapCmd()
    {
      ushort val = (ushort)Cmd;
      byte[] buf = BitConverter.GetBytes(val);
      return BitConverter.ToDouble(new byte[] { buf[1], buf[0], 0, 0, 0, 0, 0, 0 }, 0);
    }

    в ячейку «Формула» и поставил галку «использовать формулу» и передал СКАДА серверу.

    После этого Сервер пишет:

    2017-04-04 10:15:38 <DESKTOP-VTI42UO><СИСТЕМА><ACT> Формулы считаны из базы конфигурации
    2017-04-04 10:15:38 <DESKTOP-VTI42UO><СИСТЕМА><ERR> Ошибка при компилировании исходного кода формул: 
    Строка 458, колонка 65: error CS1525: Недопустимый терм "double" в выражении
    Строка 458, колонка 74: error CS1002: ожидалась ;
    Строка 458, колонка 74: error CS1525: Недопустимый терм ")" в выражении
    Для ознакомления с исходным кодом см. файл D:\RapidSCADA\ScadaServer\Log\CalcEngine.cs
    2017-04-04 10:15:38 <DESKTOP-VTI42UO><СИСТЕМА><ERR> Нормальная работа программы невозможна.

    (К стати не удобно что прямо из окна где это сообщение пишется в программе СКАДА-сервера назывемое «Журнал», нельзя это скопировать, надо лезть в лог файл. Хотябы кнопку рядом приварить, чтоб открывать блокнотом этот файл. А вообще растягивать окно Скада серверу не помешалот бы — все сообщения в форме «Журнал» не помещаются)

    Почему данное действие вдруг свалило сервер и от этого нет зашиты — думаю отдельный баг репорт…

    Так вот после удаления формулы через СКАДФ-администратор из этой ячейки ситуацию не меняет. Открытие файла CalcEngine.cs тоже делу не помогает — потому что это тоже лог и удаление указанной строки (458) не помогает

    Теперь у меня сервер лежит и как его поднять я не понимаю.

    UPD: Засунул формулу в Формулы вот так:

    Поменял место куда вношу формулу — в каланы управления перетащил:

    Сообщение от Сервера сменилось на:

    2017-04-04 10:50:22 <DESKTOP-VTI42UO><СИСТЕМА><ACT> Формулы считаны из базы конфигурации
    2017-04-04 10:50:22 <DESKTOP-VTI42UO><СИСТЕМА><ERR> Ошибка при компилировании исходного кода формул: 
    Строка 464, колонка 102: error CS1502: Наиболее подходящий перегруженный метод для "System.Convert.ToDouble(object)" имеет несколько недопустимых аргументов
    Строка 464, колонка 119: error CS1503: Аргумент "1": преобразование типа из "группа методов" в "object" невозможно
    Для ознакомления с исходным кодом см. файл D:\RapidSCADA\ScadaServer\Log\CalcEngine.cs
    2017-04-04 10:50:22 <DESKTOP-VTI42UO><СИСТЕМА><ERR> Нормальная работа программы невозможна.
    • Ответ изменён 9 лет, 3 месяца назад пользователем VitaliyAT.
    в ответ на: Ограничения по ModBUS? #5045
    VitaliyAT
    Участник

    бАнальный бАрмалей! (~восторг смешанный с удивлением и ноткой досады за потраченное время, но радостью за результат)… кто ж знал-то, что группы это запросы… заработал лисапед!

    Надо назвать не «группа элементов», а «группа элементов запроса». Я дума он их сам подбивает в пакеты запросов…

    • Ответ изменён 9 лет, 3 месяца назад пользователем VitaliyAT.
    • Ответ изменён 9 лет, 3 месяца назад пользователем VitaliyAT.
    в ответ на: Ограничения по ModBUS? #5041
    VitaliyAT
    Участник

    При смене начального адреса группы:

    Ничего не меняется.

    Оставил только Ai — всё точно также.

    в ответ на: Ограничения по ModBUS? #5037
    VitaliyAT
    Участник

    Вот убрал 10 байт тоесть 5 Аi элементов — осталось 124 байт то есть 60 элементов — заработало. (как показал опыт научного тыка) Адресация верна. Но больше 124 ни в какую не хочет. При этом каждая группа начинается с 1го элемента. И как я показал выше всё попадает в цель на уровне всех групп регистров и из ModBUS pull и из СКАДЫ и со стороны ПЛК. Проблема с количеством самих элементов.

    • Ответ изменён 9 лет, 3 месяца назад пользователем VitaliyAT.
    • Ответ изменён 9 лет, 3 месяца назад пользователем VitaliyAT.
    • Ответ изменён 9 лет, 3 месяца назад пользователем VitaliyAT.
    в ответ на: Ограничения по ModBUS? #5029
    VitaliyAT
    Участник

    Коммуникатор же сам присваивает Адреса считываемым параметрам:

    Адресация в ПЛК соответсвует норме:
    Coils 0х (отправляю из ModbusPull):
    Первый:
    coil1 mbp

    Послений:

    Discrete registers 1x (отправляю меняя значения в ПЛК, без СКАДы):
    Первый:


    Последний:

    Input registers 3x (отправляю меняя значения в ПЛК, без СКАДы):
    Первый:


    Последний:

    Holding Registers 4x (Из modbus pull в ПЛК):
    Первый:


    Послкдний:

    С помощью MODbus Pull всё читается и записывается.

    Смотрю в коммуникатор МВТ1: адрес автоматический:

    Смотрю в коммуникатор МВТ0: адрес тоже 1:

    Отправляю изменения из ПЛК:

    Получаю в Коммуникаторе:

    Нормально.

    Даю команду на запись из Коммуникатора, по адресу 1:

    всё перезаписано в нужном месте и приходит именно в 0х — специально проверяю:

    Отправляю команду на запись 4х (№501):


    Команда принятая в нерасшифрованный массив:

    В расшифрованный:

    Всё нормально… но в Коммуникаторе ошибка при чтении Ai:

    • Ответ изменён 9 лет, 3 месяца назад пользователем VitaliyAT.
    в ответ на: Ограничения по ModBUS? #5025
    VitaliyAT
    Участник

    «ModBUS Pull» при этом считывает и пишет любые 600 в любых массивах. Значит дело где-то в Коммуникаторе.

    • Ответ изменён 9 лет, 3 месяца назад пользователем VitaliyAT.
Просмотр 15 сообщений - с 16 по 30 (из 44 всего)