Ответы в темах
-
АвторЗаписи
-
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).
VitaliyATУчастникmanjey73, мы про это говорим?:

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

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

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

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

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

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

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

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

4. В прибор отправляется …
123,456
5. Проблема заключается в следующем: …
СКАДА-коммуникатор неверно читает Дабл переменные записанные самой СКАДОЙ.
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.
VitaliyATУчастник
бАнальный бАрмалей! (~восторг смешанный с удивлением и ноткой досады за потраченное время, но радостью за результат)… кто ж знал-то, что группы это запросы… заработал лисапед!
Надо назвать не «группа элементов», а «группа элементов запроса». Я дума он их сам подбивает в пакеты запросов…
VitaliyATУчастникПри смене начального адреса группы:

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

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

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


Послений:


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


Последний:


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


Последний:


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


Послкдний:


С помощью MODbus Pull всё читается и записывается.
Смотрю в коммуникатор МВТ1: адрес автоматический:

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

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

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

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

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

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


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

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

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


-
Ответ изменён 9 лет, 3 месяца назад пользователем
VitaliyAT.
-
Ответ изменён 9 лет, 3 месяца назад пользователем
-
АвторЗаписи