VitaliyAT

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

Просмотр 14 сообщений - с 31 по 44 (из 44 всего)
  • Автор
    Записи
  • 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 байт):
    меняем на 4 элемента в коммуникаторе
    Затем переотправляю команду:
    повторная отправка команды
    Получаю:
    получившийся массив
    Запрягаю «ModBUS pull»:
    Настройка modbus pull
    Получаю:
    Результат modbus pull
    Перезапрягаю Modbus pull по другому:
    результат

    (Как меня достал местный метод вставки картинок…)
    Получаю тоже самое (0) только со знаком минус (-0)

    Как бы не срослось.

    • Ответ изменён 9 лет, 3 месяца назад пользователем VitaliyAT.
    • Ответ изменён 9 лет, 3 месяца назад пользователем VitaliyAT.
    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 параметров по человечески, пожалуйста! Чтоб можно было выбирать что и как вращается и местами меняется.

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

    У меня просто в окне (или элементе окна) где выводится «ДОС» текст и графика было написано «Нет данных»

    VitaliyAT
    Участник

    Из этого диалога ничего непонятно.

    Вот как считать float я понял — надо развернуть местами по 2 байта. То есть была последовательность байтов 1234, надо отправить 3412.

    Как это сделать через Коммуникатор-программы?
    Я делал ЛинииСвязи-ЛинияХ-Команда-Стандартная-654,321-отправить — приходит мракобесина

    Как из самой СКАДЫ? Какое доп. шаманство там надо? Видео про это ничего не говорит. Там ещё как-то? Запишите доп. видео по приёму-передаче float значений пожалуйста.

    С Coil вопросов нет.

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

    Про Коомуникатор-ЛинииСвязи-ЛинияХ-СтатистикаЛинииСвязи

    Мне помогла переустановка, но это брутальный подход. Как восстановить работоспособность без переустановки пока осталось загадкой.

    VitaliyAT
    Участник

    Как поправить чтобы были данные?… а не начальную страницу. Просто подумал что может это взаимосвязано. Версия RapidSCADA 5.1.1

    в ответ на: Какие OPC сервера поддерживаются? #4389
    VitaliyAT
    Участник

    OPC DA но протокол 2.04 — это тот что разворачивается на ПЛК. В B&R есть ещё сервер 2.05, за отдельные немалые $, и какой-то свой PVI сервер… Но вот интересна поддержка именно 2.04.

    • Ответ изменён 9 лет, 5 месяцев назад пользователем VitaliyAT.
    в ответ на: B&R Automation #4384
    VitaliyAT
    Участник

    Modbus TCP работает. OPC 2.04 похоже нет.

    VitaliyAT
    Участник

    Перезапустил комп — пока помогло… Но откуда ноги растут пока не понял.

    VitaliyAT
    Участник

    Если залезть в службы Windows (10) и попытаться перезапустить службу оттуда, то пишет:

    Не удалось остановить (перезапустить — без разницы) службу ScadaCommService на Локальный компьютер.
    Ошибка 1061: Служба в настоящее время не может принимать команды.

Просмотр 14 сообщений - с 31 по 44 (из 44 всего)