PDA

Просмотр полной версии : ПЛК200 + DS18B20



KorSerO
05.12.2023, 14:45
Нужна помощь. Подключил два датчика температуры ds18b20 по 1-wire через модуль WB-M1W2 к ПЛК200 по RS485(Modbus). Потратив кучу времени получилось добиться адекватных значений с этих датчиков, НО! Почему то не получается выводить данные сразу с двух датчиков. С каждого по отдельности могу, а сразу с двух никак. Я пробовал создавать и два мастера два слейва, и один мастер два слейва, и сейчас пытаюсь с одного мастера и одного слейва получить данные (и в одном канале и в разных каналах). В ответ получаю либо нули на обоих датчиках либо одинаковые неадекватные значения (например 1050 или 2000). Ни ошибок ни предупреждений компилятор не выдает. Как мне заставить сие чудо работать? Или так не получится?

P.S. я еще учусь работать с кодесис и программировать плк, поэтому просьба тапками не бросаться)

Евгений Кислов
05.12.2023, 14:56
Нужна помощь. Подключил два датчика температуры ds18b20 по 1-wire через модуль WB-M1W2 к ПЛК200 по RS485(Modbus). Потратив кучу времени получилось добиться адекватных значений с этих датчиков, НО! Почему то не получается выводить данные сразу с двух датчиков. С каждого по отдельности могу, а сразу с двух никак. Я пробовал создавать и два мастера два слейва, и один мастер два слейва, и сейчас пытаюсь с одного мастера и одного слейва получить данные (и в одном канале и в разных каналах). В ответ получаю либо нули на обоих датчиках либо одинаковые неадекватные значения (например 1050 или 2000). Ни ошибок ни предупреждений компилятор не выдает. Как мне заставить сие чудо работать? Или так не получится?

P.S. я еще учусь работать с кодесис и программировать плк, поэтому просьба тапками не бросаться)

Добрый день.
Я рекомендую сначала подключить WB-M1W2 к ПК через конвертер RS-485/USB и добиться нужного вам варианта опроса с помощью какого-нибудь ПО - например, Modbus Universal Master OPC Server. Если уже на этом этапе возникнут проблемы - то обращайтесь в техподдержку Wirenboard.
Если с ПК получится настроить опрос, а с ПЛК нет - то, пожалуйста, свяжитесь со мной (мои контакты в подписи) утром любого буднего дня.

KorSerO
06.12.2023, 06:34
Добрый день.
Я рекомендую сначала подключить WB-M1W2 к ПК через конвертер RS-485/USB и добиться нужного вам варианта опроса с помощью какого-нибудь ПО - например, Modbus Universal Master OPC Server. Если уже на этом этапе возникнут проблемы - то обращайтесь в техподдержку Wirenboard.
Если с ПК получится настроить опрос, а с ПЛК нет - то, пожалуйста, свяжитесь со мной (мои контакты в подписи) утром любого буднего дня.

Я настраивал через утилиту Rilheva Modbus Poll (сами Wirenboard рекомендуют через нее). Там с обоих датчиков данные идут все в порядке, просто видимо в кодесисе нужно что то настроить, а вот что я не знаю.72160

Евгений Кислов
06.12.2023, 06:36
Я настраивал через утилиту Rilheva Modbus Poll (сами Wirenboard рекомендуют через нее). Там с обоих датчиков данные идут все в порядке, просто видимо в кодесисе нужно что то настроить, а вот что я не знаю.

Свяжитесь со мной через telegram, пожалуйста (данные в подписи) и предоставьте удаленный доступ через AeroAdmin или AnyDesk.

KorSerO
06.12.2023, 06:50
Свяжитесь со мной через telegram, пожалуйста (данные в подписи) и предоставьте удаленный доступ через AeroAdmin или AnyDesk.

Не могу предоставить удаленный доступ, т.к. компьютер рабочий. Можно как то по другому вопрос решить?

Евгений Кислов
06.12.2023, 06:56
Не могу предоставить удаленный доступ, т.к. компьютер рабочий. Можно как то по другому вопрос решить?

Можно связаться через телеграм и расшарить экран вашего ПК.

KorSerO
06.12.2023, 07:01
72161 - модбас и слейв
72162 - в канале указал какие регистры читать
72163 - ну а тут уже привязал переменные к данным каждого регистра
Вроде все нормально, а вот почему не работает - вопрос.

kondor3000
06.12.2023, 08:39
- модбас и слейв
- в канале указал какие регистры читать
- ну а тут уже привязал переменные к данным каждого регистра
Вроде все нормально, а вот почему не работает - вопрос.

У вас в модбас пуле 2 отдельных регистра типа INT, адреса 7 и 8. А в ПЛК у вас 2 регистра читаются ка один REAL, это не правильно.
Две переменные надо объявить как Int, а читать как 2 отдельных WORD в адресами 7 и 8.
А так же в пуле 2 стоп бита, а в Овене по умолчанию 1 стоп бит, проверьте.
Полученные целочисленные значения надо разделить на 10.

KorSerO
06.12.2023, 09:55
У вас в модбас пуле 2 отдельных регистра типа INT, адреса 7 и 8. А в ПЛК у вас 2 регистра читаются ка один REAL, это не правильно.
Две переменные надо объявить как Int, а читать как 2 отдельных WORD в адресами 7 и 8.
А так же в пуле 2 стоп бита, а в Овене по умолчанию 1 стоп бит, проверьте.
Полученные целочисленные значения надо разделить на 10.

72167 - стоп биты правильно стоят
72168 72169 - вот я по каналам разделил, по идее как два разных регистра должно читаться
72170 - вот как у меня переменные объявлены
72171 - вот кусок программы для обработки данных. Долго по интернету лазил чтобы понять как данные обработать и все хорошо работает если подключать датчики по одному, а сразу два никак.

kondor3000
06.12.2023, 10:15
72167 - стоп биты правильно стоят
- вот я по каналам разделил, по идее как два разных регистра должно читаться
вот как у меня переменные объявлены
- вот кусок программы для обработки данных. Долго по интернету лазил чтобы понять как данные обработать и все хорошо работает если подключать датчики по одному, а сразу два никак.

Объединение UNION не нужно в данном случае, полученные 2 шт. WORD присвоить в переменные INT, и просто конвертировать INT_TO_REAL и потом разделить на 10.
В WORD (INT) уже должны быть значения, типа 235, после конвертации и деления на 10 получите 23,5 градуса.
INT нужен, чтобы не потерять отрицательные значения (если они будут). Например -2 градуса в INT, в переменной WORD будет 65534

KorSerO
06.12.2023, 11:10
Объединение UNION не нужно в данном случае, полученные 2 шт. WORD присвоить в переменные INT, и просто конвертировать INT_TO_REAL и потом разделить на 10.
В WORD (INT) уже должны быть значения, типа 235, после конвертации и деления на 10 получите 23,5 градуса.
INT нужен, чтобы не потерять отрицательные значения (если они будут). Например -2 градуса в INT, в переменной WORD будет 65534

А почему нужно делить именно на 10? Я находил информацию о том что полученное число нужно умножить на 0.0625 или поделить на 16 (значения все равно одинаковые получаются)
72174 - вот делю на 10, а при умножении на 0.0625 или делении на 16 получается 39 градусов (датчик лежит на батарее)
72175 - еще компилятор выдает предупреждение. Его можно игнорировать? Знак в случае чего не потеряется?

KorSerO
06.12.2023, 12:50
Вроде сделал как вы предложили, но ничего не поменялось. Мб что то еще нужно?
72177 72178
72179 - вот тут видно что на выходе имеем какую то белиберду (сейчас эти значения сменились нулями)

kondor3000
06.12.2023, 13:18
А почему нужно делить именно на 10? Я находил информацию о том что полученное число нужно умножить на 0.0625 или поделить на 16 (значения все равно одинаковые получаются)
- вот делю на 10, а при умножении на 0.0625 или делении на 16 получается 39 градусов (датчик лежит на батарее)
- еще компилятор выдает предупреждение. Его можно игнорировать? Знак в случае чего не потеряется?

На счёт деления на 10, это предположение, обычно так передаётся дробная часть через целочисленную переменную типа INT, как у вас сделано, должно быть в инструкции.
А вот что я написал вы не сделали нормально, переменные оставили старые, какие там типы на скринах не видно. У вас должно что то прийти в обеих переменных в слейве. Удалите всё и сделайте снова как написал. Кроме того, после таких переделок надо очистить всё и компилировать всё.

KorSerO
06.12.2023, 13:29
На счёт деления на 10, это предположение, обычно так передаётся дробная часть через целочисленную переменную типа INT, как у вас сделано, должно быть в инструкции.
А вот что я написал вы не сделали нормально, переменные оставили старые, какие там типы на скринах не видно. У вас должно что то прийти в обеих переменных в слейве. Удалите всё и сделайте снова как написал. Кроме того, после таких переделок надо очистить всё и компилировать всё.

72180 - вот я поменял типы и на скринах выше видно что эффекта это не дало
72181 - вот что происходит при запуске

KorSerO
06.12.2023, 14:57
Странно, создал сейчас новый проект только с датчиками и там все нормально работает. MAGIC
Придется ковыряться что в моем не так((

kondor3000
06.12.2023, 15:18
Странно, создал сейчас новый проект только с датчиками и там все нормально работает. MAGIC
Придется ковыряться что в моем не так((

Всё уже написал, удалить UNION вообще, переменные INT создать в PLC_PRG, вставить их в слейв, после переделки, очистить всё и компилировать всё!

KorSerO
07.12.2023, 06:45
Всё уже написал, удалить UNION вообще, переменные INT создать в PLC_PRG, вставить их в слейв, после переделки, очистить всё и компилировать всё!

Все заработало так как нужно, спасибо большое за помощь! Теперь буду пробовать брать значения с датчиков по вызову в программе.

kondor3000
07.12.2023, 10:32
Все заработало так как нужно, спасибо большое за помощь! Теперь буду пробовать брать значения с датчиков по вызову в программе.

Это плохой вариант, чтение, тем более с датчиков должно быть циклическим и постоянным. Можно изменить период чтения.
А вот запись можно делать по изменению или по биту из программы.