This is topic Проблема со сборкой STRING из аргументов программы in forum TRACE MODE 6 бесплатная Базовая версия / TRACE MODE 6 free Base version at Форум TRACE MODE: техническая поддержка.
Проект переводит время из контроллера из формата BCD в строку, чтобы потом записать в MS SQL. FBD программой я разбиваю BCD числа на string аргументы: year_e, month_e, ... sec_e. Следующей программой на ST я складываю из этих аргументов строку следующим образом: datetime_end_CMNT:=day_e+'-'+month_e+'-'+year_e+' '+hour_e+':'+min_e+':'+sec_e;
В комментарии канала datetime_end ожидаю увидеть строку типа "6-10-15 12:11:59", но по факту получаю строку "6-10-15 12:11:11", т.е. значение sec_e в конце строки дублирует значение min_e. Путем экспериментов выявил, что проблема именно в значении sec_e.
Пробовал привязать аргумент программы FBD sec_e к входному значению HEX канала, а реальное значение этого канала привязать к аргументу sec_e в программе ST. В результате вижу, что значение канала HEX принимает правильное значение 59, но в datetime_end все равно получаю "6-10-15 12:11:11".
Перепроверил ВСЕ привязки. Ну не могу найти затык и все тут.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Введите промежуточную локальную переменную VAR_STRING с типом данных STRING. Модифицируйте ST-программу: VAR_STRING:=day_e+'-'+month_e+'-'+year_e+' '+hour_e+':'+min_e; datetime_end_CMNT:=VAR_STRING':'+sec_e;
Другой вариант. Полученные из FBD-программы данные передайте в соответствующие атрибуты канала класса TIME. Этот канал сам преобразует эти данные в переменную формата Date&Time. Привяжите эту переменную к аргументу типа Date&Time CALL.SQL и передавайте время в БД штатным образом.
Posted by Hip67 (Участник № / Member № 4427) on :
Попробовал вариант с промежуточной переменной - не работает. Результат тот же самый.
Над вторым вариантом попробую. Отпишусь.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Второй вариант лучше.
Но вот такая конструкция сработала.
PROGRAM VAR_INPUT D : USINT; END_VAR VAR_INPUT M : USINT; END_VAR VAR_INPUT Y : USINT; END_VAR VAR_INPUT H : USINT; END_VAR VAR_INPUT Min : USINT; END_VAR VAR_INPUT Sec : USINT; END_VAR VAR_INOUT String_out : STRING; END_VAR VAR VAR_string : STRING; END_VAR
VAR_string := D + '-'+ M + '-'+ Y + ' ';
VAR_string := VAR_string + H + ':' + Min + ':';
String_out := VAR_string + sec;
END_PROGRAM
Posted by Hip67 (Участник № / Member № 4427) on :
Попробовал вариант с каналом TIME. Так даже проще, дату сервер принимает и записывает без проблем. Обработку строк удалю из готового проекта. Спасибо.
Posted by ProKa (Участник № / Member № 6538) on :
Здравствуйте, пытаюсь в подсказку к ГЭ вывести значение типа STRING, сгенерированное в программе (тип аргумента string, in/out). Привязку осуществляю напрямую к аргументу программы. В подсказку выводятся только 4 знака. Правильно ли я понимаю, что для передачи большего количеству знаков необходимо использовать канал CALL.string? Вопрос снят, спасибо.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Не обязательно. Можно передавать через текстовый атрибут какого-либо канала, например, через КОММЕНТАРИЙ.
Posted by ProKa (Участник № / Member № 6538) on :
Получилось. НО! в комментарий передается не больше 40 знаков? Можно увеличить размер сообщения хотя бы до 64?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Можно, если использовать в качество промежуточных аргументы канала CALL.STRING.