PDA

Просмотр полной версии : Тип данных в ovenCloud



MrGavai
12.10.2023, 11:32
Добрый день, подключил пр103 напрямую в облаку для ведения счета. Счетчик у меня 32 разрядный с макросов и может считать очень далеко, значения передаю в сетевую переменную, а в облаке происходит переполнение переменной после 65000, как это победить? Как корректно указать в ПР103 и в облаке тип int 32?

melky
12.10.2023, 11:47
в облаке вроде UInt32, Int32, Int64, UInt64 присутствуют под номерами 3,4,7,8 (как в облаке они выбираются не в курсе)

1exan
12.10.2023, 11:52
Добрый день, подключил пр103 напрямую в облаку для ведения счета. Счетчик у меня 32 разрядный с макросов и может считать очень далеко, значения передаю в сетевую переменную, а в облаке происходит переполнение переменной после 65000, как это победить? Как корректно указать в ПР103 и в облаке тип int 32?

Нужно в программе ПР разложить 32 разрядное число на 2 16-разрядных слова и присвоить их соседним сетевым регистрам. В облаке читать как 32 разрядное целое по меньшему адресу 16-разрядного слова

MrGavai
12.10.2023, 13:50
В облаке да есть, но если в облаке поменять тип, то идут рандомные цифры вместо реальных

melky
12.10.2023, 14:11
Ну так как 1exan и говорит, вероятно вы свой счетчик кинули в один регистр, а указывая 32-х битный вариант в облаке вы читаете еще следующий регистр, вот и получаете рендомные числа.

MrGavai
12.10.2023, 14:52
Нужно в программе ПР разложить 32 разрядное число на 2 16-разрядных слова и присвоить их соседним сетевым регистрам. В облаке читать как 32 разрядное целое по меньшему адресу 16-разрядного слова

Можно поподробнее по поводу раскладки 32 разрядов в 2 16 разрядных

melky
12.10.2023, 14:58
MrGavai примеров на форуме масса. Суть, сама переменная в ПР 32-х битная. Регистр 16-ти битный. Если нужна полная по сети, ее надо разбить на два регистра, при записи команды собрать из двух регистров.

1exan
12.10.2023, 16:42
function_block DW_TO_2WORD //имя функционального блока.

var_input
DW : udint;
end_var

var_output //объявление выходных переменных
W1 : udint;
W2 : udint;
end_var

W2 := SHR(DW,16);
W1 := SHR(SHL(DW,16),16);

end_function_block

70895
70897
70896

melky
12.10.2023, 16:48
1exan а / и % имеются в ST ?

1exan
12.10.2023, 16:55
1exan а / и % имеются в ST ?

в смысле просто деление и деление по модулю?
деление просто есть конечно, а по модулю это в ST оператор MOD

melky
12.10.2023, 17:07
1exan ну вот, зачем тогда двигать все подряд (SHR, SHL), если можно подвинуть только одно значение.
скажем так, что окажется быстрее и эффективнее?

1exan
12.10.2023, 17:14
1exan ну вот, зачем тогда двигать все подряд (SHR, SHL), если можно подвинуть только одно значение.
скажем так, что окажется быстрее и эффективнее?

Не знаю, мне так проще. Полагаю, что операция сдвига одна из самых дешёвых.
Для W1 я бы наверное сделал AND, но этот оператор в OL не работает с целочисленными значениями (не перегружен)

Можно кстати это сделать на FBD, там есть и SHR и AND

melky
12.10.2023, 17:23
да, AND и прочее в ST пр-ки пока не завезли...