Обучаем новичка программированию ПЛК (kobrik)
Re: Обучаем новичка программированию ПЛК (kobrik)
Превышена общая квота вложений. У меня тоже это сообщение выскакивало. Сейчас я увеличил квоту. Все должно работать.
Re: Обучаем новичка программированию ПЛК (kobrik)
Спасибо большое Михайло. Так вот я создал соединение через универсальный Модбас ОРС сервер Инсат по протоколу Модбас ТСР. Вроде все работает. Чтоб передать флаг из контроллера ОВЕН в инструкции надо создать тип данных 1 байт (8 бит) где возможно использовать каждый бит. А аналоговое значение передается через типданных в WORD.
В Модбас ОРС сервере Инсат все сделал по инструкции. Вот скриншоты конфигурации, все читается и записывается.
Я уверен здесь имеются люди которые знают модбас, регистры я уже определил через универсальный Модбас ОРС сервер Инсат, остается просто все правильно прописать в Сименсе, с чем я так и не справился .
И еще как проверить и протестировать, что соединение работает? Спасибо всем заранее, буду очень признателен за любую информацию.У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Автоматизатор
- Профессионал
- Сообщения: 993
- Зарегистрирован: 09 окт 2012, 05:18
Re: Обучаем новичка программированию ПЛК (kobrik)
Адрес и количество данных попутал.
Re: Обучаем новичка программированию ПЛК (kobrik)
REQ=true - ОК
DISCONNECT=false - ОК
CONNECT_ID=1 - ОК
IP_OCTET - будем считать, что IP-адрес Овна действительно 10.2.11.203, ОК
IP_PORT=502 - ОК
MB_MODE=0 - ОК, читаем данные
MB_DATA_ADDR=1 - здесь важно правильно задать нужный адрес, от этого адреса зависит, что ты считываешь - входные/выходные биты или регистры. В данном случае считываются выходные биты. MB_DATA_ADDR=10001 - чтение входных битов, MB_DATA_ADDR=30001 - чтение входных регистров, MB_DATA_ADDR=40001 - чтение выходных регистров.
MB_DATA_LEN=2000 - две тысячи 16-битных слов - это круто Такое значение допустимо для Modbus, но тогда сервер также должен выдавать 2000 слов.
MB_DATA_PTR=DB1.DBB12 - неправильно, ты сейчас подставил сюда DB1.DBB12, текущее значение этого байта равно нулю, т.е. ты указал нулевой адрес для записи. Правильно здесь нужно задать адрес с помощью указателя (pointer) P# на первый бит памяти: P#DB1.DBX12.0 WORD 2. Тот же самый результат даст запись P#DB1.DBX12.0 BYTE 4. Сименс ограничивает запись в свою память указанием длины WORD 2 = BYTE 4. В данном случае два слова (четыре байта). Просто запомнить эту нотацию и понять, как ее строить для своего случая. Можно указывать другие области памяти, например: P#M1000.0 WORD 100. Судя по примерам Сименса, ограничение может быть задано больше, чем MB_DATA_LEN, не обязательно равные значения.
DISCONNECT=false - ОК
CONNECT_ID=1 - ОК
IP_OCTET - будем считать, что IP-адрес Овна действительно 10.2.11.203, ОК
IP_PORT=502 - ОК
MB_MODE=0 - ОК, читаем данные
MB_DATA_ADDR=1 - здесь важно правильно задать нужный адрес, от этого адреса зависит, что ты считываешь - входные/выходные биты или регистры. В данном случае считываются выходные биты. MB_DATA_ADDR=10001 - чтение входных битов, MB_DATA_ADDR=30001 - чтение входных регистров, MB_DATA_ADDR=40001 - чтение выходных регистров.
MB_DATA_LEN=2000 - две тысячи 16-битных слов - это круто Такое значение допустимо для Modbus, но тогда сервер также должен выдавать 2000 слов.
MB_DATA_PTR=DB1.DBB12 - неправильно, ты сейчас подставил сюда DB1.DBB12, текущее значение этого байта равно нулю, т.е. ты указал нулевой адрес для записи. Правильно здесь нужно задать адрес с помощью указателя (pointer) P# на первый бит памяти: P#DB1.DBX12.0 WORD 2. Тот же самый результат даст запись P#DB1.DBX12.0 BYTE 4. Сименс ограничивает запись в свою память указанием длины WORD 2 = BYTE 4. В данном случае два слова (четыре байта). Просто запомнить эту нотацию и понять, как ее строить для своего случая. Можно указывать другие области памяти, например: P#M1000.0 WORD 100. Судя по примерам Сименса, ограничение может быть задано больше, чем MB_DATA_LEN, не обязательно равные значения.
- Автоматизатор
- Профессионал
- Сообщения: 993
- Зарегистрирован: 09 окт 2012, 05:18
Re: Обучаем новичка программированию ПЛК (kobrik)
Михайло писал(а):MB_DATA_LEN=2000
По моему уже было, но еще раз: адреса у Сименса десятичные и начинаются с 1, а у большинства устройств с 0. Мораль: к адресу надо добавить спереди указатель на тип данных, а к адресу добавить 1.Михайло писал(а):MB_DATA_ADDR=10001 - чтение входных битов, MB_DATA_ADDR=30001 - чтение входных регистров, MB_DATA_ADDR=40001 - чтение выходных регистров.
Так, если надо считать данные выходных регистров, начиная с адреса 20hex, то MB_DATA_ADDR=40033
(20hex -> 32dec; добавляем 1 -> 33dec; добавляем 4 -> 40033dec)
Re: Обучаем новичка программированию ПЛК (kobrik)
Не понял. Что добавляем?Автоматизатор писал(а):добавляем 4 -> 40033dec
- Автоматизатор
- Профессионал
- Сообщения: 993
- Зарегистрирован: 09 окт 2012, 05:18
Re: Обучаем новичка программированию ПЛК (kobrik)
адрес в инверторе 20hexМихайло писал(а):Не понял. Что добавляем?
адрес в программе Сименса 40033dec
получается переводом числа из шестнадцатеричной системы в десятичную и добавлением грубо числа 40001
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Re: Обучаем новичка программированию ПЛК (kobrik)
В принципе у Сименса четко написано, что адреса начинаются с 1, 10001, 30001 и 40001. У всех производителей по-разному, стандарт Modbus не устанавливает четко все нюансы. Из-за неточно заданных адресов ошибки соединения быть не должно. Будут только глюки, поначалу непонятные получаемые данные.
Re: Обучаем новичка программированию ПЛК (kobrik)
Через ПЛК браузер изменил IP-адрес Овна:Михайло писал(а):IP_OCTET - будем считать, что IP-адрес Овна действительно 10.2.11.203, ОК
PLCInfo
PLC model MODEL PLC 110-30
Binary VERSION 0.2.49
Need Target version >= 3.04
Compiled: 08:25:33 Apr 23 2014
MAC 6A:77:00:23:00:E9
IP 192.168.0.3
GATE 192.168.0.1
MASK 255.255.255.0
Скришот был старым: 192.168.0.3.
Re: Обучаем новичка программированию ПЛК (kobrik)
Какой адрес у S7-1200?
Re: Обучаем новичка программированию ПЛК (kobrik)
192.168.0.1Михайло писал(а):Какой адрес у S7-1200?
Re: Обучаем новичка программированию ПЛК (kobrik)
Какой сейчас статус у функции MB_CLIENT?
Re: Обучаем новичка программированию ПЛК (kobrik)
Статус: 16#0000, проверял. Все еще мне неясно как работать с поинтерами для указания ячейки в памяти...Михайло писал(а):Какой сейчас статус у функции MB_CLIENT?
Re: Обучаем новичка программированию ПЛК (kobrik)
Статус=0 означает, что данные принимаются. Разве не так?
Просто пишешь "хочу чтобы писал в память, начиная с ячейки такой-то длины такой-то". То есть пишешь:
P#начальная_ячейка WORD количество_слов_максимум.
Просто пишешь "хочу чтобы писал в память, начиная с ячейки такой-то длины такой-то". То есть пишешь:
P#начальная_ячейка WORD количество_слов_максимум.
Re: Обучаем новичка программированию ПЛК (kobrik)
В том то и дело что обмен идет, простно нужно правильно сослаться на регистр в ОВЕН и правильно указать ячейку контроллера.Михайло писал(а):Статус=0 означает, что данные принимаются. Разве не так?
Я пишу, но у меня выдает ошибку и не компилируется, а сам адрес остается красным, указывая на неправильный синтаксис. Пропишите пожалуйста, может я что-то не правильно указываю. Проект прикреплен к сообщению. Не хочу у вас отнимать много времени, просто исправьте плииз адреса, а дальше я самМихайло писал(а):Просто пишешь "хочу чтобы писал в память, начиная с ячейки такой-то длины такой-то". То есть пишешь:
P#начальная_ячейка WORD количество_слов_максимум.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Re: Обучаем новичка программированию ПЛК (kobrik)
1) Я ввел "P#DB1.DBX18.0 WORD 2" и работает. Обрати внимание на два пробела вокруг "WORD".
2) Структура Modbus_Data в блоке DB1. Что-то мне кажется обращение к ячейке DB1.DBX18.0 не будет соответствовать Modbus_Data.40003. Я бы на твоем месте для начала не создавал сложные структуры, а просто работал бы с простыми переменными типа WORD. Или ты уверен, что это заработает?
3) MB_DATA_ADDR=40033 - поменьше слушай Автоматизатора Этот адрес будет соответствовать адресу 40032 или 40033 на стороне Овна. Ты в какой ячейке памяти на стороне Овна готовишь данные на передачу?
4) Ты передаешь 1 слово (MB_DATA_LEN=1)?
2) Структура Modbus_Data в блоке DB1. Что-то мне кажется обращение к ячейке DB1.DBX18.0 не будет соответствовать Modbus_Data.40003. Я бы на твоем месте для начала не создавал сложные структуры, а просто работал бы с простыми переменными типа WORD. Или ты уверен, что это заработает?
3) MB_DATA_ADDR=40033 - поменьше слушай Автоматизатора Этот адрес будет соответствовать адресу 40032 или 40033 на стороне Овна. Ты в какой ячейке памяти на стороне Овна готовишь данные на передачу?
4) Ты передаешь 1 слово (MB_DATA_LEN=1)?
Re: Обучаем новичка программированию ПЛК (kobrik)
Я этим методом создавал соединение с универсальным Модбас ОРС сервером Инсат. Я попробую сделать так как вы говорите еще раз, а где мне сохранять данные для их использования в программе?Михайло писал(а): 2) Структура Modbus_Data в блоке DB1. Что-то мне кажется обращение к ячейке DB1.DBX18.0 не будет соответствовать Modbus_Data.40003. Я бы на твоем месте для начала не создавал сложные структуры, а просто работал бы с простыми переменными типа WORD. Или ты уверен, что это заработает?
Вот адреса памяти в ОВНЕ, которые я считывал из универсального Модбас ОРС сервера Инсат. Пытаюсь считаывть и записывать с тех же самых ячеек с помощью Сименса.Михайло писал(а): 3) MB_DATA_ADDR=40033 - поменьше слушай Автоматизатора Этот адрес будет соответствовать адресу 40032 или 40033 на стороне Овна. Ты в какой ячейке памяти на стороне Овна готовишь данные на передачу?
Может я чтото не правильно указал, наверное если мы введем ввел "P#DB1.DBX18.0 WORD 2", то MB_DATA_LEN будет равен 2. Подскажите правильно ли я выразился?Михайло писал(а):4) Ты передаешь 1 слово (MB_DATA_LEN=1)?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Re: Обучаем новичка программированию ПЛК (kobrik)
Как можно их мониторить?kobrik писал(а): Я этим методом создавал соединение с универсальным Модбас ОРС сервером Инсат. Я попробую сделать так как вы говорите еще раз, а где мне сохранять данные для их использования в программе?
Re: Обучаем новичка программированию ПЛК (kobrik)
Там же в DB1 сохраняй, только создай не структуру Struct, а пачку переменных типа WORD. Главное, чтобы были переменные с offset +18.0, +20.0, куда и будут писаться данные.kobrik писал(а):Я попробую сделать так как вы говорите еще раз, а где мне сохранять данные для их использования в программе?
Там для дискретных катушек задан начальный адрес 0. Значит надо ловить данные, начиная с ячейки 1.kobrik писал(а):Пытаюсь считаывть и записывать с тех же самых ячеек с помощью Сименса.
Одной функции MB_CLIENT недостаточно, вторая функция должна считывать Holding registers, начиная с адреса 40002, т.к. в Овне начальный адрес 1.
Ты этот момент с адресами 1, 10001, 30001, 40001 уловил?
Эти значения могут быть различные, но логично все-таки задать одинаковые числа.kobrik писал(а):Может я чтото не правильно указал, наверное если мы введем ввел "P#DB1.DBX18.0 WORD 2", то MB_DATA_LEN будет равен 2. Подскажите правильно ли я выразился?
MB_DATA_LEN определяет длину запрашиваемых данных, которую нужно вписывать в Modbus-запрос клиента. Указатель P# определяет длину вроде как для безопасности, чтобы не было переполнения памяти.
Re: Обучаем новичка программированию ПЛК (kobrik)
Пачка переменных? что это значит? Если мы введем P#DB1.DBX18.0 WORD 2 в блоке то все равно не показывает в DB1...Михайло писал(а): Там же в DB1 сохраняй, только создай не структуру Struct, а пачку переменных типа WORD. Главное, чтобы были переменные с offset +18.0, +20.0, куда и будут писаться данные.
Да уловил, это в зависимости что мы хотим считывать или записывать, применяем адреса. К примеру Holding registers использует такой вид: 40001.Михайло писал(а): Ты этот момент с адресами 1, 10001, 30001, 40001 уловил?