Ответы в темах
-
АвторЗаписи
-
VitaliyATУчастникМожет понадобиться любой вариант. Так как я спец в ПЛК и пока не шибкоспец в СКАДЕ, то мне её по меньше и надо задействовать, а в ПЛК я всё равно настройку ModBUS организую. Плюс сегодня одна СКАДА к нему цепляется, завтра властным решением рук-ва другая. Одна может вращать, другая нет.
-
Ответ изменён 9 лет, 3 месяца назад пользователем
VitaliyAT.
VitaliyATУчастникВскрыл я эту консервную банку. Помогла мне этом программа Floating Point Conversion и калькулятор Винды 10. (Перtвёл 10тизначные в HEX, )
Коммуникатор отправляет Double в последовательности байт 21436587:

Оставлю (главным образом для себя, остальные — велкам) рабочий код на ST:
(* MBT to Double *) FUNCTION MBT2Double brsmemcpy((pDouble+0), (pMBT+Order1), 1); brsmemcpy((pDouble+1), (pMBT+Order2), 1); brsmemcpy((pDouble+2), (pMBT+Order3), 1); brsmemcpy((pDouble+3), (pMBT+Order4), 1); brsmemcpy((pDouble+4), (pMBT+Order5), 1); brsmemcpy((pDouble+5), (pMBT+Order6), 1); brsmemcpy((pDouble+6), (pMBT+Order7), 1); brsmemcpy((pDouble+7), (pMBT+Order8), 1); brsmemcpy((pDouble+0), (pMBT+2), 1); brsmemcpy((pDouble+1), (pMBT+1), 1); brsmemcpy((pDouble+2), (pMBT+4), 1); brsmemcpy((pDouble+3), (pMBT+3), 1); brsmemcpy((pDouble+4), (pMBT+6), 1); brsmemcpy((pDouble+5), (pMBT+5), 1); brsmemcpy((pDouble+6), (pMBT+8), 1); brsmemcpy((pDouble+7), (pMBT+7), 1); MBT2Double := 0; RETURN; END_FUNCTION-
Ответ изменён 9 лет, 3 месяца назад пользователем
VitaliyAT.
VitaliyATУчастникА можно разжевать? Моя попытка:
public double fRevers (int rev) { float q = Convert.ToSingle(CmdVal); //конвертируем значение команды в float ("число с плавающей запятой одиночной точности") (как при этом вращаются байты ?№1) byte[] f = new byte[4]; //создаём новый массив для разворотов - "массив откуда" byte[] o = new byte[4]; //создаём новый массив для разворотов - "массив куда" f = BitConverter.GetBytes(q); //потрошим float в массив побайтно Array.Copy(f,0,o,0,4); //копируем ("массив откуда", координата элемента массива откуда, "массив куда", координата массива куда, сколько байт) - в данном случаи весь массив в весь массив if (rev == 1) //если реверс - да, то { Array.Copy(f, 0, o, 1, 1); // 1 в 2 Array.Copy(f, 1, o, 0, 1); // 2 в 1 Array.Copy(f, 2, o, 3, 1); // 3 в 4 Array.Copy(f, 3, o, 2, 1); // 4 в 3... таким образом 1234 = 2143 } Array.Resize(ref o, 8); //ресайзим массив до 8 элементов (то есть у нас получается 21340000 - где 0 пустой байт) Double ou = BitConverter.ToDouble(o,0); //запихиваем массив в дабл-число (как при этом вращаются байты ?№2) return ou; //возвращаем двойное число }Ок, допустим, что коммуникатор также выносит мозг ПЛК (как бы в этот момент осознав, что возврат такой изврат я бьюсь в тихой истерике).
Как мне готовить ПЛК к такому развитию событий? Предполагаю что считывать массив по 4 элемента в дабл, потом конвертить его куда и во что надо…
И я так понимаю «гудбай!» те проекты кто уже сделал МодБАС под 4 байта возврата с максимумом одним простым реверсом, (при том что его вообще можно не делать — простое человеческое «нахрена?» и «почему делая потенциально всеподходящий инструмент, так сузить его возможности в одном месте, что равносильно ставить под сомнение просто его применение!?») и хотели перевести свой АРМ на RapidSCADA.
Тем не менее беру меняю команду отправки в Коммуникаторе, чтоб отправлялось 4 элемента (каждый по 2 байта, того 8 байт):

Затем переотправляю команду:

Получаю:

Запрягаю «ModBUS pull»:

Получаю:

Перезапрягаю Modbus pull по другому:

(Как меня достал местный метод вставки картинок…)
Получаю тоже самое (0) только со знаком минус (-0)Как бы не срослось.
VitaliyATУчастникмы ж в ветке Коммуникатора находимся? — в нём родимом.
скриншоты…

ЗЫ Крепить их тут то ещё удовольствие. Потому так мало визуальных вещей на форуме.
VitaliyATУчастникЦена вопроса?
VitaliyATУчастникПри отправке 654,321 из коммуникатора и получении в первом элементе байтового массива «8624», второго — «29288».
Приёмку значений на стороне ПЛК отрабатывает код (на ST + ПЛК B&R):
CASE fWordSwap OF 0: // без переворота 0123 = 0123 brsmemcpy(pReal, pMBT, 4); 1: // Простой переворот 0123 = 2301 brsmemcpy((pReal+0), (pMBT+2), 1); brsmemcpy((pReal+1), (pMBT+3), 1); brsmemcpy((pReal+2), (pMBT+0), 1); brsmemcpy((pReal+3), (pMBT+1), 1); //brsmemcpy(pReal, (pMBT+2), 2); //brsmemcpy((pReal+2), pMBT, 2); 2: // Хитрый переворот 1 0123 = 1032 (Рэпид скаде такой вроде) brsmemcpy((pReal+0), (pMBT+1), 1); brsmemcpy((pReal+1), (pMBT+0), 1); brsmemcpy((pReal+2), (pMBT+3), 1); brsmemcpy((pReal+3), (pMBT+2), 1); 3: // Хитрый переворот 2 0123 = 3210 brsmemcpy((pReal+0), (pMBT+3), 1); brsmemcpy((pReal+1), (pMBT+2), 1); brsmemcpy((pReal+2), (pMBT+1), 1); brsmemcpy((pReal+3), (pMBT+0), 1); 4: // Хитрый переворот 3 0123 = 3120 brsmemcpy((pReal+0), (pMBT+3), 1); brsmemcpy((pReal+1), (pMBT+1), 1); brsmemcpy((pReal+2), (pMBT+2), 1); brsmemcpy((pReal+3), (pMBT+0), 1); 5: // Хитрый переворот 4 0123 = 3021 brsmemcpy((pReal+0), (pMBT+3), 1); brsmemcpy((pReal+1), (pMBT+0), 1); brsmemcpy((pReal+2), (pMBT+2), 1); brsmemcpy((pReal+3), (pMBT+1), 1); END_CASE;копировать_в_память (куда, откуда, сколько)
Ничего вразумительного ни по одному из авриантов я не получаю.
Я хочу организовать расшифровку на стороне ПЛК.
Как отправку кодирует Коммуникатор?
…ОК… допусти если кодировать будет СКАДА получается кодирует по другому, точнее её можно заставить кодировать по другому через вышеприведённую формулу…
Уважаемые разработчики, сделайте настройки для кодирования float параметров по человечески, пожалуйста! Чтоб можно было выбирать что и как вращается и местами меняется.
VitaliyATУчастникУ меня просто в окне (или элементе окна) где выводится «ДОС» текст и графика было написано «Нет данных»
VitaliyATУчастникИз этого диалога ничего непонятно.
Вот как считать float я понял — надо развернуть местами по 2 байта. То есть была последовательность байтов 1234, надо отправить 3412.
Как это сделать через Коммуникатор-программы?
Я делал ЛинииСвязи-ЛинияХ-Команда-Стандартная-654,321-отправить — приходит мракобесинаКак из самой СКАДЫ? Какое доп. шаманство там надо? Видео про это ничего не говорит. Там ещё как-то? Запишите доп. видео по приёму-передаче float значений пожалуйста.
С Coil вопросов нет.
VitaliyATУчастникПро Коомуникатор-ЛинииСвязи-ЛинияХ-СтатистикаЛинииСвязи
Мне помогла переустановка, но это брутальный подход. Как восстановить работоспособность без переустановки пока осталось загадкой.
VitaliyATУчастникКак поправить чтобы были данные?… а не начальную страницу. Просто подумал что может это взаимосвязано. Версия RapidSCADA 5.1.1
VitaliyATУчастникOPC DA но протокол 2.04 — это тот что разворачивается на ПЛК. В B&R есть ещё сервер 2.05, за отдельные немалые $, и какой-то свой PVI сервер… Но вот интересна поддержка именно 2.04.
-
Ответ изменён 9 лет, 5 месяцев назад пользователем
VitaliyAT.
VitaliyATУчастникModbus TCP работает. OPC 2.04 похоже нет.
VitaliyATУчастникПерезапустил комп — пока помогло… Но откуда ноги растут пока не понял.
VitaliyATУчастникЕсли залезть в службы Windows (10) и попытаться перезапустить службу оттуда, то пишет:
Не удалось остановить (перезапустить — без разницы) службу ScadaCommService на Локальный компьютер.
Ошибка 1061: Служба в настоящее время не может принимать команды. -
Ответ изменён 9 лет, 3 месяца назад пользователем
-
АвторЗаписи