PDA

Просмотр полной версии : В ФБ ST не компилируется цикл FOR



M_321
22.11.2017, 11:26
PROGRAM MAIN_PROGRAM

VAR_INPUT
N_t:Byte;
END_VAR
var
i:byte;
end_var
VAR_OUTPUT
out:real;
END_VAR

(*TODO: TYPE PROGRAM CODE HERE*)

FOR i:=1 TO N_t DO
out:=i/10;
END_FOR;
out:=i/10;
END_PROGRAM


Запущена компиляция.
D:\MasterSCADA Projects\Projects\stend_1\Config\STtoSharpSolution \p383\code.st(24,1) : Ошибка FOR i:=1 TO N_t DO: Оператор FOR:ST.SemanticError.ExpectedExpressionOfType
Компилируем p383
Ошибка CS5001: Программа "d:\MasterSCADA Projects\Projects\stend_1\Config\STtoSharpSolution \p383\obj\x86\Debug\p383.exe" не содержит статический метод "Main", подходящий для точки входа
Компиляция провалена. (00:00:01.1670667)

В чем проблема?

P.S.
3.8.0.58188 3.8(RT32ReleaseMax)_17_04_21_13_34
Лицензионная версия. (Ограниченная версия)
Ограничение на число параметров OPC - 32.
Ограничение на число задействованных выходов ФБ - 32.
Ограничение на число связей с другими компьютерами - 32.
Ограничение на число экземпляров - 32.
MSRT-HDA-Client

capzap
22.11.2017, 11:30
байт не является числом, сделайте переменные INT-ом и всё должно получиться

M_321
22.11.2017, 12:56
Спасибо!
заработало)

IVM
22.11.2017, 13:28
байт не является числом, сделайте переменные INT-ом и всё должно получиться

А почему в CoDeSys с байтом катит ?

capzap
22.11.2017, 14:50
А почему в CoDeSys с байтом катит ?

разве на форуме мало примеров, когда разработчики реализуют хотелки пользователей,а потом сталкиваются с попбочными эффектами. Так же и КДС где то сделал облегчение, которое сказывается на программерах пользующих другое ПО, а сименс например поступает как на картинке

IVM
22.11.2017, 16:13
разработчики реализуют хотелки пользователей,а потом сталкиваются с попбочными эффектами.

И чем чревата эта хотелка в CoDeSys ? Я в операторах CASE в качестве селектора всегда использую переменную типа BYTE или WORD.

Владимир Ситников
22.11.2017, 16:28
И чем чревата эта хотелка в CoDeSys ? Я в операторах CASE в качестве селектора всегда использую переменную типа BYTE или WORD.

К сожалению, сам стандарт 61131 крайне странный.
Технически, там BYTE-WORD-DWORD это не числа, а bit strings. Т.е. они предназначены только для работы с битами.
При этом, сложение-вычитание этих самых BYTE в стандарте не предусмотрено.

Но программисты (почему-то!) хотят писать код в духе dwordVar := 1; или dwordVar := dwordVar + 1;
С точки зрения стандарта вообще непонятно как оно должно работать (и должно ли), но заставлять программистов указывать вручную что-то типа dwordVar := DINT_TO_DWORD(DWORD_TO_DINT(dwordVar) + 1); было бы совсем дико (а, может, и нет).

CoDeSys пошли по пути автоматических неявных приведений типов (почти любых к любым). А, значит, будут случаи, когда "автоматика" сработает самым неожиданным образом.

По какому пути пойдут разработчики MS -- интересно.

capzap
22.11.2017, 17:04
По какому пути пойдут разработчики MS -- интересно.
так ведь дает исключение, путь уже устоявшийся

Владимир Ситников
22.11.2017, 17:22
так ведь дает исключение, путь уже устоявшийся

Ну, там же вопрос не про один for, а про систему типов.
У них any_bit будет поддерживать сложение?

Например:
dword_var: DWORD;
sint_var: SINT;

dword_var := -1 XOR -2;
или
dword_var := BYTE_TO_DWORD(-1 XOR 2);
или
dword_var := dword_var + 1;
или
dword_var := -1;
или
sint_var := -1;
dword_var := sint_var;
или
dword_var := INT_TO_SINT(-1);

и т.п.

Про КДС было тут: http://www.owen.ru/forum/showthread.php?t=23013&page=33&p=232746&viewfull=1#post232746