PDA

Просмотр полной версии : функция ABS. что не так я делаю??



DIPHENHYDRAMINE
04.12.2018, 18:38
ребята что яделаю не так?
40212
в эмуляторе.....

40213
в ПЛК....

40214

petera
04.12.2018, 19:14
ребята что яделаю не так?
40212
в эмуляторе.....

40213
в ПЛК....

40214
Справа Вы вычисляете разность двух целых без знаковых чисел(формат WORD), а слева хотите получить значение целое знаковое (INT)

T_v-T_z = 65526, а не (-10), т.к. T_v и T_z Вы объявили как WORD, для WORD нету знака "-"

Соответственно ABS (65526) = 65526

А вот дальше, когда выполняется
T_d := 65526
получается -10, что совершенно правильно, ведь для INT значение 65526 - это -10 в дополнительном коде

T_v и T_z нужно объявить как INT

DIPHENHYDRAMINE
04.12.2018, 19:17
Потому, что
T_v-T_z = 65526, а не (-10), т.к. T_v и T_z Вы объявили как WORD, для WORD нету знака "-"

Соответственно ABS (65526) = 65526

А вот дальше, когда выполняется
T_d := ABS...
что-то случается с автоматическим приведением типов
Ведь справа Вы вычисляете разность двух целых без знаковых чисел(формат WORD), а слева хотите получить значение целое знаковое (INT)

T_v и T_z нужно объявить как INT

так по логике я делаю WORD-WORD= INT……. почему в эмуляторе все нормально?

DIPHENHYDRAMINE
04.12.2018, 19:22
и в справке...…
40216

IVM
04.12.2018, 19:22
ребята что яделаю не так?
40212
в эмуляторе.....

40213
в ПЛК....

40214

Косяк в прошивке ПЛК160.

petera
04.12.2018, 19:22
так по логике я делаю WORD-WORD= INT
никакой логики
WORD имеет диапазон значений от 0 до 65535
INT имеет диапазон значений от -32768 до 32767
и 65526 есть число отрицательное -10 в дополнительном коде

DIPHENHYDRAMINE
04.12.2018, 19:26
да.... с INT все норм работает..... Спасибо!!
будем знать....

но логика на мой взгляд все же есть..... 5(WORD) - 10(WORD) = -5(INT)

IVM
04.12.2018, 19:30
никакой логики
WORD имеет диапазон значений от 0 до 65535
INT имеет диапазон значений от -32768 до 32767
и 65526 есть число отрицательное -10 в дополнительном коде

В эмуляторе почему другой результат получается ?

DIPHENHYDRAMINE
04.12.2018, 19:33
В эмуляторе почему другой результат получается ?

в эмуляторе все правильно…. а в ПЛК не понятно....в справке ведь написано
параметр результат

WORD

INT, REAL, WORD, DWORD, DINT

DIPHENHYDRAMINE
04.12.2018, 19:36
ну petera у нас авторитет..... поправлю в проекте.....
просто на объекте сегодня не въехал сразу

petera
04.12.2018, 19:52
да.... с INT все норм работает..... Спасибо!!
будем знать....

но логика на мой взгляд все же есть..... 5(WORD) - 10(WORD) = -5(INT)

5(WORD) - 10(WORD) = 65531 = -5(INT),

это для INTдействительно -5

Что не противоречит результату Вашего первого вопроса, а наоборот даже подтверждает мои объяснения
Еще раз, по шагам
T_v-T_z = 740 -750 = 65526, так?
значит ABS(65526) = 65526, так?

T_d := 65526 = -10 , т.е. 740(WORD) -750(WORD) = -10(INT)

IVM
04.12.2018, 19:56
petera, а это как прокомментируете ? В эмуляторе все верно. Почему функцию ABS программа ПЛК160 неверно отрабатывает ?

DIPHENHYDRAMINE
04.12.2018, 20:03
и в ПЛК 740-750 = -10
40218

IVM
04.12.2018, 20:06
и в ПЛК 740-750 = -10
40218

А почему в ПЛК160 результат T_d := ABS (T_v-T_z); равен -10 ? Вы уже забыли о чем спрашивали ?

DIPHENHYDRAMINE
04.12.2018, 20:09
вот...
40220
выше там не правильно....

IVM
04.12.2018, 20:27
Посмотри как ПЛК160 отрабатывает эту программу.

DIPHENHYDRAMINE
04.12.2018, 20:32
вот...
40222

IVM
05.12.2018, 09:35
5(WORD) - 10(WORD) = 65531 = -5(INT),

это для INTдействительно -5

Что не противоречит результату Вашего первого вопроса, а наоборот даже подтверждает мои объяснения
Еще раз, по шагам
T_v-T_z = 740 -750 = 65526, так?
значит ABS(65526) = 65526, так?

T_d := 65526 = -10 , т.е. 740(WORD) -750(WORD) = -10(INT)

А в эмуляторе почему другой результат получается ?

petera
05.12.2018, 11:09
А в эмуляторе почему другой результат получается ?

По мне так в ПЛК как раз верный результат, а почему в эмуляторе другой - это вопрос к 3S-Smart Software.
Ну или у Пролога спросить https://forum-ru.codesys.com/viewforum.php?f=9&sid=e0d421f88637931d6a856006fd7177c0

IVM
05.12.2018, 11:58
По мне так в ПЛК как раз верный результат, а почему в эмуляторе другой - это вопрос к 3S-Smart Software.
Ну или у Пролога спросить https://forum-ru.codesys.com/viewforum.php?f=9&sid=e0d421f88637931d6a856006fd7177c0

А как из под функции ABS может вылезти отрицательное число ?

petera
05.12.2018, 12:20
А как из под функции ABS может вылезти отрицательное число ?

Почему отрицательное?
ABS(65526) = 65526
Нет здесь отрицательного числа
А теперь приведите это число к формату переменной INT
Test:= WORD_TO_INT(65526);
Что получите?
Правильно -10

ЗЫ.
Учитывайте разрядную сетку и диапазон представления чисел в ЭВМ.

Это из серии
56000(WORD) + 30000(WORD) = 29464(WORD)
караул! почему 29464? Ведь должно быть 86000 !

IVM
05.12.2018, 12:37
Значит WORD в общем случае не может быть параметром функции ABS. Таблица не верна.

petera
05.12.2018, 12:58
Значит WORD в общем случае не может быть параметром функции ABS. Таблица не верна.

Почему не может?
ABS(65526) = 65526 - что здесь не так? Аргумент функции ABS() не обязательно должен быть отрицательным.
Просто WORD не может быть отрицательным.

Если уж так хочется использовать в выражениях переменные различных форматов, то в кодесис есть операторы преобразования типов.
ABS(WORD_TO_INT(65536)) = ABS(-10) = 10.

IVM
05.12.2018, 13:14
Почему не может?
ABS(65526) = 65526 - что здесь не так? Аргумент функции ABS() не обязательно должен быть отрицательным.
Просто WORD не может быть отрицательным.

Если уж так хочется использовать в выражениях переменные различных форматов, то в кодесис есть операторы преобразования типов.
ABS(WORD_TO_INT(65536)) = ABS(-10) = 10.

Без костылей (WORD_TO_INT) использование в выражениях переменных различных форматов может дать неверный результат.

IVM
05.12.2018, 13:24
Почему не может?
ABS(65526) = 65526 - что здесь не так? Аргумент функции ABS() не обязательно должен быть отрицательным.
Просто WORD не может быть отрицательным.

Если уж так хочется использовать в выражениях переменные различных форматов, то в кодесис есть операторы преобразования типов.
ABS(WORD_TO_INT(65536)) = ABS(-10) = 10.

По хорошему разработчики прошивки ПЛК160 перед компиляцией исходного текста программы должны были сделать преобразование ABS(A-B) в ABS(WORD_TO_INT(A-B)). В эмуляторе это преобразование сделано поэтому результат там получается правильный при любом раскладе.

petera
05.12.2018, 14:04
Проблема всего лишь в исходном коде программы, а именно в разделе объявления переменных
40224

Достаточно было СРАЗУ объявить T_v и T_z как INT, тем более,что в программе предполагалось вычитать одно из другого, из чего следует, что будут использоваться целые положительные, отрицательные и ноль, а не обезличенный WORD, который даже числом и не считается вовсе.