PDA

Просмотр полной версии : Modbus oni PLR studio



Алмаз Нафиков
14.07.2025, 08:29
Короче изучаю другие контроллеры для развития и столкнулся с проблемой что то не так делаю.
Самоучка.

Контроллер oni , программа modbus OPC
Прописал теги чтобы можно было читать и записывать в программе, я написал адрес 4576 и запускаю программу она не читает.
Проблемы с другими регистрами как дискретный вход/выход, аналоговый я разобрался, а вот как с временами, часами я не понял

kondor3000
14.07.2025, 08:46
Короче изучаю другие контроллеры для развития и столкнулся с проблемой что то не так делаю.
Самоучка.

Контроллер oni , программа modbus OPC
Прописал теги чтобы можно было читать и записывать в программе, я написал адрес 4576 и запускаю программу она не читает.
Проблемы с другими регистрами как дискретный вход/выход, аналоговый я разобрался, а вот как с временами, часами я не понял

Чем отличается тип DWORD от типа INT16, знаете? Адрес тоже не правильный

Алмаз Нафиков
15.07.2025, 22:06
Чем отличается тип DWORD от типа INT16, знаете? Адрес тоже не правильный

Нет, ещё не разобрался чем отличаются, а почему адрес не верный? Там же модбас указан, с обычными coils так получается, а здесь как тогда писать адрес

Dimensy
16.07.2025, 05:54
На первой картинке у вас адрес для REG0 = 24576, почему вы задаете 4576?
На второй картинке у вас тип данных в устройстве INT16, но, согласно первой картинки, число занимает 2 регистра, т.е., вы должны указать, как минимум, INT32. Возможно UINT32 (или как там число без знака обозначается), а еще, возможно, придется поиграться с перестановкой байт

Алмаз Нафиков
16.07.2025, 06:35
На первой картинке у вас адрес для REG0 = 24576, почему вы задаете 4576?
На второй картинке у вас тип данных в устройстве INT16, но, согласно первой картинки, число занимает 2 регистра, т.е., вы должны указать, как минимум, INT32. Возможно UINT32 (или как там число без знака обозначается), а еще, возможно, придется поиграться с перестановкой байт

Тоесть надо написать 0 ?

Алмаз Нафиков
16.07.2025, 06:38
На первой картинке у вас адрес для REG0 = 24576, почему вы задаете 4576?
На второй картинке у вас тип данных в устройстве INT16, но, согласно первой картинки, число занимает 2 регистра, т.е., вы должны указать, как минимум, INT32. Возможно UINT32 (или как там число без знака обозначается), а еще, возможно, придется поиграться с перестановкой байт

Я вот не разобрался с функциями int16 и прочее, где можно найти информацию чтобы понять новичку

imaex
16.07.2025, 07:49
Я вот не разобрался с функциями int16 и прочее, где можно найти информацию чтобы понять новичку

int16 - это не функция, а тип данных. Для REG0 адрес будет 24576, для REG1 -24578. И т.д. Без лидирующей 4-ки. 4х - это просто мнемонический указатель на тип регистра, holding в данном случает. Каждый регистр вашего ПЛК занимает 2 слова, т.е. DWORD. В типах данных это может быть LONG (int32), ULONG (uint32), FLOAT и т.п.. Т.е. любой тип данных, для представления которого нужны 2 слова. Всё.

Информацию новичку можно найти даже в википедии. Не говоря о прочем.

Алмаз Нафиков
16.07.2025, 08:39
int16 - это не функция, а тип данных. Для REG0 адрес будет 24576, для REG1 -24578. И т.д. Без лидирующей 4-ки. 4х - это просто мнемонический указатель на тип регистра, holding в данном случает. Каждый регистр вашего ПЛК занимает 2 слова, т.е. DWORD. В типах данных это может быть LONG (int32), ULONG (uint32), FLOAT и т.п.. Т.е. любой тип данных, для представления которого нужны 2 слова. Всё.

Информацию новичку можно найти даже в википедии. Не говоря о прочем.

Ага, вроде более менее понятно стало, начал показывать, теперь говорите с перестановкой байтов надо пробовать чтобы коректно отображалось, 1 цифра только подошла, остальные пока не получается

kondor3000
16.07.2025, 08:52
Ага, вроде более менее понятно стало, начал показывать, теперь говорите с перестановкой байтов надо пробовать чтобы коректно отображалось, 1 цифра только подошла, остальные пока не получается

Поставьте тип UINT32 (аналог DWORD), адреса 24576 и 24578, пробуйте переставить регистры (байты)
Выложите скрины

Алмаз Нафиков
16.07.2025, 11:57
Поставьте тип UINT32 (аналог DWORD), адреса 24576 и 24578, пробуйте переставить регистры (байты)
Выложите скрины

Вот сделал, но я изменил программу и поставил другой адрес, поставил 24614

Совпадает только одна цифра, "секунда" Остальные минуты не совпадают

kondor3000
16.07.2025, 13:17
Вот сделал, но я изменил программу и поставил другой адрес, поставил 24614

Совпадает только одна цифра, "секунда" Остальные минуты не совпадают

Вы можете цифры озвучить, сколько должно и сколько показывает.

Должно быть 3 варианта ещё, при перестановке регистров и байт,
при перестановке байт из 48286 получается 40636

Алмаз Нафиков
17.07.2025, 12:49
Вы можете цифры озвучить, сколько должно и сколько показывает.

Должно быть 3 варианта ещё, при перестановке регистров и байт,
при перестановке байт из 48286 получается 40636

Короче алябирда какая то, у меня в программе только 24614 а тут он считывает 24614-24616
Почему так? Я же адрес 24616 не загружал в программу, должен показывать ноль

Короче он сейчас должен показывать 99:00 минут а в значении показывает непонятные цифры, совпадает только вначале, когда считывает секунды, доходит до 60 секунды а потом начинается ересь без совпадений.
Пробовал перестановки байт, не помогает, что оо не так делаю наверно.

С обычными дискретными аналоговыми входами работал и работает по сей день а с временем не получается настроить

kondor3000
17.07.2025, 13:24
С какого вы решили, что должно показывать 99:00 , это по вашему целое число? Это только вывод времени на экран такой.

Вообще то время передаётся как, Время= Час*3600 + Мин*60 + Секунды в формате DWORD в секундах, 99 минут это 5940 секунд
или Время *1000 в формате DWORD, в миллисекундах, 99 минут это 5940 000 ms

Алмаз Нафиков
17.07.2025, 13:48
С какого вы решили, что должно показывать 99:00 , это по вашему целое число? Это только вывод времени на экран такой.

Вообще то время передаётся как, Время= Час*3600 + Мин*60 + Секунды в формате DWORD в секундах, 99 минут это 5940 секунд
или Время *1000 в формате DWORD, в миллисекундах, 99 минут это 5940 000 ms


Капец, я то думал как положено должен показать, мда уж.

"Старшим байтом вперёд " Получается, правильно показывает в секундах.

А как теперь мне в скаде показать его в нормальном виде, и чтобы можно было менять эту установленное время.
Вот допустим таймер выставлен на 90 минут, но его надо будет менять например на 50 минут

kondor3000
17.07.2025, 13:56
В скаде может быть Дисплей отображения времени как в панели, если такого нет, разбиваете сами на час, мин, сек и выводите

Алмаз Нафиков
17.07.2025, 14:04
В скаде может быть Дисплей отображения времени как в панели, если такого нет, разбиваете сами на час, мин, сек и выводите

Попробую. А какой делать запись? В OPC ввожу число 3000 это 50 минут, но запись не меняется с 99 минут на 50 минут, что не так делаю

kondor3000
17.07.2025, 14:07
Попробую. А какой делать запись? В OPC ввожу число 3000 это 50 минут, но запись не меняется с 99 минут на 50 минут, что не так делаю

В ОРС сервере ставите чтение (функция 0х03) и запись (функция 0х10),
в скаде также и записывайте

Алмаз Нафиков
17.07.2025, 14:22
В ОРС сервере ставите чтение (функция 0х03) и запись (функция 0х10),
в скаде также и записывайте

Везде искал такие функции но его нет, может как то по другому называется, вот попробовал написать 6000 таймер сработал на 1 минуту, написал 12000,сработал на 2 минуты, вроде понял как

Теперь осталось это в нормальном виде написать,
В скаде попробовать надо как это делать, чтобы каждый раз не делить на 60 сек. завтра займусь

Алмаз Нафиков
17.07.2025, 14:23
В ОРС сервере ставите чтение (функция 0х03) и запись (функция 0х10),
в скаде также и записывайте

Спасибо вам большое за помощь

kondor3000
17.07.2025, 14:53
В скаде попробовать надо как это делать, чтобы каждый раз не делить на 60 сек. завтра займусь
Вообще обычно в скаде задаётся в минутах или секундах, передаёте, а все расчёты делаются в ПЛК, так удобнее.

Мало того задачу до 99 минут лучше передать через 1 регистр WORD (UINT16), а не DWORD (2 регистра)