Контроллер SMSD4.2 с RS 485 поддерживает Modbus ?
 

Контроллер SMSD4.2 с RS 485 поддерживает Modbus ?

Автор e74, 02 ноября 2016, 08:32:28

« назад - далее »

e74

Вопрос:
Контроллер SMSD4.2 с RS 485 поддерживает протокол Modbus RTU?


e74

 А какой протокол обмена Rs 485? Можно ссылку.

Administrator

Протокол пока такой же, как у блоков с USB - http://electroprivod.ru/pdf/SMSD-4.2-pasp.pdf - раздел 7.

e74

В паспорте указаны только АТ команды.Меня интересует формат посылки пакета.
Нам нужно управлять SMSD4.2 с RS 485 с панели оператора Weintek MT8070iE там нет винды. Какой протокол используется для связи по RS 485 ? ASCII? Можно документ-описание пакетной части?

Administrator

используется ASCII, для RS-485 необходима посимвольная передача, т.к. контроллер отправляет эхо после каждого введенного символа. Формат команд и коды ответов приведены в паспорте.
В настоящий момент команды состоят из 2х символов кода команды, нескольких символов параметров (если команда предусматривает параметры) и символ *.

Для программирования в EasyBuilder в параметрах устройства для подключаемого контроллера SMSD необходимо выбрать тип PLC "Free Protocol". Для отправки данных контроллеру используется команда OUTPORT, для чтения INPORT.

Administrator

#6
Пример для EasyBuilder Pro (для EasyBuilder 8000 тоже подходит):
В примере контроллер SMSD подключен к COM2
BytesToPort - переменная содержит количество байт для передачи в порт (количество символов в команде)       
command_string - строка, содержащая передаваемую команду
symb - переменная для чтения из порта
ResponseString - переменная для получения общего ответа от контроллера (эхо + код ответа)
       
              PURGE(2) //очистка буферов порта COM2
      for i=0 to (BytesToPort-1) step 1 // отправка команды по 1 байту,
         OUTPORT(command_string[ i ], "SMSD COM2 RS-485", 1) //посылка 1 байта в порт
         FILL(symb[0], '', 4)
         INPORT(symb[0], "SMSD COM2 RS-485", 1, return_value) //эхо команды
         StringCat(symb[0], ResponseString[0])
   
         SetData(ResponseString[0], "Local HMI", LW, 110, BytesFromPort) //при необходимости можно вывести данные в регистры панели, например, для отображения на экране
      next i
      i=i+1
      FILL(Symb[0], '', 4)
      INPORT(Symb[0], "SMSD COM2 RS-485", 4, return_value) // теперь нужно получить код ответа
      StringCat(symb[0], ResponseString[0])
                SetData(ResponseString[0], "Local HMI", LW, 110, BytesFromPort)

e74

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

Administrator

Так пример выше - это и есть макрос для передачи данных для EasyBuilder.
Или Вы хотите готовый проект?

Для какой модели панели Вы пишете программу? Для MT8070iE?

P.S. Вы можете купить у нас панель Weintek с готовой программой для работы с блоками SMSD, BMSD и BLSD.
http://electroprivod.ru/mt6071ie.htm

e74

Ощущение что мы общаемся на разных языках. Похоже ,что я не могу правильно задать вопрос поскольку не владею терминологией.
Я хочу подключить Контроллер SMSD к панели оператора Weintek по RS 485 И чтобы они друг -друга видели
Проект пишется в изибилдере
Что я должен указать в "Системные настройки" ,"Параметры устройства" ,"тип ПЛК" Чтобы панель оператора увидела Ваш контроллер?
Планируется использовать MT 8071iE  Нужны 3 сом порта, Изернет и УСБ
Кроме управления ШД нужно измерять температуру , вести учет входящих-исходящих образцов, сканер штрихкода , связь с диспечерским компьютером. В общем , если бы можно было вызывать Вашу программу из моего экрана - это бы устроило. То есть при нажатии кнопки на моем экране "изменить скорость" вызывалась бы Ваша программа типа  SMSD control. Там бы вносились изменения скорости и нажималась кнопка "Возврат" для возврата в основной экран. Можно ли получить такую встраиваемую подпрограмму? Как?  У кого?
Код SMSD control получить возможно?

Administrator

#10
Для подключения SMSD RS485 к панели Weintek нужно в EasyBuilder выбрать меню "правка" - "системные настройки" - "создать".

При этом будет создано подключение для нового устройства. Откроется окно настроек устройства, в котором нужно указать имя, по которому Вы будете обращаться к нему из скрипта (любое удобное Вам), тип ПЛК (free protocol), тип подключения ПЛК RS-485 2w, порт подключения  (выбирайте порт, к которому Вы будете подключать блок SMSD) и настройки порта по паспорту SMSD (8 бит данных, 1 стоп бит, проверка четности, скорость 9600):



Далее создаете скрипт со следующим содержимым:

             PURGE(2) //очистка буферов порта COM2 в этом примере SMSD подключен к COM2
                            //если у Вас другой номер порта, указываете его в параметре функции PURGE
      
             for i=0 to (BytesToPort-1) step 1 // отправка команды по 1 байту,
                             //BytesToPOrt содержит количество символов команды, которые нужно передать контроллеру.
                             
         OUTPORT(command_string[ i ], "SMSD COM2 RS-485", 1) //посылка 1 байта в порт
                        //"SMSD COM2 RS-485" - имя устройства, которое Вы дали блоку SMSD в настройках при подключении
         // command_string содержит строку команды, например, MV1000* - перемещение на 1000 шагов
                        FILL(symb[0], '', 4)
                        //symb - переменная для чтения из порта, предварительно ее значение стирается
         INPORT(symb[0], "SMSD COM2 RS-485", 1, return_value) //эхо команды
                       //командой INPORT считываем ответ, пришедший из порта. Сначала это эхо передаваемых символов                          команды         
                       StringCat(symb[0], ResponseString[0])
         //ResponseString переменная для хранения полного ответа из порта
         
         SetData(ResponseString[0], "Local HMI", LW, 110, BytesFromPort)
                        //выводится значение в регистр LW110 - например, для отображения на экране панели
      next i
      i=i+1
      FILL(Symb[0], '', 4)
      INPORT(Symb[0], "SMSD COM2 RS-485", 4, return_value) //ответ - т.е. код ответа - 4 символа
      StringCat(symb[0], ResponseString[0])
                 SetData(ResponseString[0], "Local HMI", LW, 110, BytesFromPort)

Administrator

Алгоритм подключения и настройки одинаков для всех устройств, которые подключаются к панели Weintek.
Если устройство имеет готовые драйвер Weintek - выбирайте его в списке "тип ПЛК" при подключении. Если готового драйвера нет - можно выбрать free protocol и использовать функции INPORT и OUTPORT.

e74

Спасибо. Вроде понятно. Буду пробовать.
Еще вопрос:
Где определены функции OUTPORTи INPORT ?
В смысле: для разных протоколов используется разный формат кадров.
для RTU такой :http://autoworks.com.ua/setevye-resheniya/modbus-rtu/
для ASCII такой:http://autoworks.com.ua/setevye-resheniya/modbus-ascii/
где выбирается формат кадра для свободного протокола?

Administrator

#13
Здесь не используется спецификация Modbus. Свободный протокол подразумевает произвольные данные, отправляемые в порт. Формата кадра как такового (как для Modbus) не существует. Можно отправлять и принимать любые данные без ограничений.

Таким образом, функциями OUTPORT и INPORT можно отправлять и принимать из порта абсолютно любые данные, независимо от того, являются они ASCII или HEX. ASCII в обмене данными для SMSD используется лишь для упрощения и наглядности (Например, команда LD - LOAD, MV - MOVE и т.д.). Если удобно, можно вместо символов отправлять коды ASCII в шестнадцатеричном виде.

Функции INPORT и OUTPORT - это встроенные функции панелей Weintek. Их описание и примеры можно посмотреть в документации к  EasyBuilder наравне со всеми прочими функциями и структурами, которые используются для написания скриптов.

В приведенном выше примере OUTPORT отправляет в порт любые данные, содержащиеся в command_string. Точнее, command_string является стартовым адресом, с которого начинается передача данных.  Третий параметр функции определяет, какое количество данных (т.е. сколько байт) нужно отправить. В данных версиях SMSD с интерфейсом RS-485 требуется побайтная отправка данных, т.к. контроллер отправляет эхо каждого байта (символа).

Т.е. чтобы отправить команду MV10000* для интерфейса RS-232 command_string должна содержать строку "MV10000*", команда отправки OUTPORT(command_string[0], "SMSD COM2 RS-485", 8 ) //посылка 8 байт в порт, начиная с нулевого (первого) символа переменной Command_string.
Для RS-485 строка разбивается побайтно, в порт шлется каждый отдельный байт:
OUTPORT(command_string[ i ], "SMSD COM2 RS-485", 1) //посылка 1 байт в порт, начиная с i.
i увеличивается на единицу в цикле с 0 до длины команды:
for i=0 to 7 step 1 // отправка команды по 1 байту,
         OUTPORT(command_string[ i ], "SMSD COM2 RS-485", 1) //посылка 1 байта в порт
         FILL(symb[0], '', 4)
         INPORT(symb[0], "SMSD COM2 RS-485", 1, return_value) //получили из порта эхо команды 1 байт         
      next i


Administrator

P.S. пробелы в приведенных примерах в функии OUTPORT(command_string[ i ] до и после i в скриптах не нужны. Здесь они проставлены, только для того, чтобы форум отображал их, а не рассматривал как служебные теги разметки.