Последовательная связь между Siemens PLC и Arduino

Я хочу иметь последовательную связь, используя Siemens S7-1200 с CM 1241 (RS-232) и общаться с моим Arduino. Вот настройка связи. У меня есть 2 датчика температуры и один светодиод, подключенный к моему Arduino, а со стороны ПЛК у меня есть S7-1200 от Siemens и CM-1241. Arduino и мой ПЛК связаны только с помощью контактов Tx и Rx, без рукопожатия.

Я отправляю данные о температуре с обоих датчиков на ПЛК. на стороне ПЛК я решаю, когда включать светодиод, подключенный к моему Arduino, в зависимости от различных значений температуры. Я присваиваю идентификатор обоим датчикам перед отправкой данных. Вот так выглядят передаваемые данные от Arduino $AOPT_TEMP1_20_TEMP2_21.

Пока все хорошо, я получаю последовательные данные на свой ПЛК, используя RCV_PTP (полученные данные помещаются в буфер), и отправляю данные, используя SEND_PTP. Я также реализовал фильтр на ПЛК, который будет принимать только последовательные данные, начинающиеся с «$ AOPT_». Теперь я хочу получить значение температуры от двух датчиков температуры TEMP1 и TEMP2, а затем управлять светодиодом. Например, если (TEMP1>TEMP2), то включите светодиод, иначе выключите.

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

Заранее спасибо....


person Electronic Curious    schedule 06.09.2015    source источник
comment
Просто чтобы подтвердить, вы спрашиваете об обработке текста на стороне ПЛК?   -  person Ignacio Vazquez-Abrams    schedule 07.09.2015
comment
Да, на стороне ПЛК   -  person Electronic Curious    schedule 07.09.2015


Ответы (1)


Разбирать строки (из последовательного буфера) в SCL просто: вы можете использовать команды: **

LEN
CONCAT
LEFT or RIGHT
MID
INSERT
DELETE
REPLACE
FIND
EQ_STRNG and NE_STRNG
GE_STRNG and LE_STRNG
GT_STRNG and LT_STRNG
INT_TO_STRING and
STRING_TO_INT
DINT_TO_STRING and
STRING_TO_DINT
REAL_TO_STRING and
STRING_TO_REAL

** Найдено в этой шпаргалке SCL: http://plc4good.org.ua/files/03_downloads/SCL_table/SCL-cheat-sheet.pdf

Я бы начал с..

  • Создание функционального блока в SCL.
  • Добавить входной атрибут в виде строки
  • Добавьте два выходных атрибута (Temp1, Temp2) как Reals или Ints
  • Несколько статических переменных для временных строк и конвертации text->real.

Проанализируйте свой код следующим образом (поскольку у меня нет моего портала TIA, возможно, потребуется изменить): для вашей строки "$AOPT_TEMP1_20_TEMP2_21", предполагая, что начало всегда "$AOPT_TEMP1_" (12 символов)

temp1_temp:=DELETE(IN1:=inputmsg,IN2:='$AOPT_TEMP1_',L:=12,P:=0);

//result should be "20_TEMP2_21"
//if you have a result above or below a 2 digit number we can't just get 
//the next two chars in the string.  so we use the FIND.

temp1_endpos:=FIND(IN1:=temp1_temp,IN2:='_');
temp1_str:=LEFT(IN1:temp1_temp,L:=temp1_endpos);
Temp1:=string_to_real(temp1_str); 

//work off of the position of the temp1_endpos and the string stored in
//temp1_temp

temp2_str:=RIGHT(IN1:=temp1_temp,LEN(temp1_temp)-temp1_endpos-6);

//working from the right side of the string 
// 20_TEMP2_21
//   ^-------pos 2   temp2_ is another 6 so we subract another 6
//         ^---pos 6
// len was (in this case) 11, we work from the right because we don't 
    // know how many digits each temp may be.

Temp2:=string_to_real(temp2_str);  

Имейте в виду, что все это не пришло мне в голову, и я использую руководство для быстрых ссылок: -US_en-US.pdf" rel="nofollow">https://cache.industry.siemens.com/dl/files/465/36932465/att_106119/v1/s71200_system_manual_en-US_en-US.pdf

Некоторые вещи могут нуждаться в корректировке. Если вы не используете/не можете использовать SCL, эти блоки также существуют в лестнице. Если вы можете, вы можете просто подключить этот функциональный блок к выполнению только после того, как вы получите свой буфер.

person Entrabiter    schedule 15.09.2015