Просмотр полной версии : функция ABS. что не так я делаю??
DIPHENHYDRAMINE
04.12.2018, 18:38
ребята что яделаю не так?
40212
в эмуляторе.....
40213
в ПЛК....
40214
ребята что яделаю не так?
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
ребята что яделаю не так?
40212
в эмуляторе.....
40213
в ПЛК....
40214
Косяк в прошивке ПЛК160.
так по логике я делаю WORD-WORD= INT
никакой логики
WORD имеет диапазон значений от 0 до 65535
INT имеет диапазон значений от -32768 до 32767
и 65526 есть число отрицательное -10 в дополнительном коде
DIPHENHYDRAMINE
04.12.2018, 19:26
да.... с INT все норм работает..... Спасибо!!
будем знать....
но логика на мой взгляд все же есть..... 5(WORD) - 10(WORD) = -5(INT)
никакой логики
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 у нас авторитет..... поправлю в проекте.....
просто на объекте сегодня не въехал сразу
да.... с 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)
petera, а это как прокомментируете ? В эмуляторе все верно. Почему функцию ABS программа ПЛК160 неверно отрабатывает ?
DIPHENHYDRAMINE
04.12.2018, 20:03
и в ПЛК 740-750 = -10
40218
и в ПЛК 740-750 = -10
40218
А почему в ПЛК160 результат T_d := ABS (T_v-T_z); равен -10 ? Вы уже забыли о чем спрашивали ?
DIPHENHYDRAMINE
04.12.2018, 20:09
вот...
40220
выше там не правильно....
Посмотри как ПЛК160 отрабатывает эту программу.
DIPHENHYDRAMINE
04.12.2018, 20:32
вот...
40222
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)
А в эмуляторе почему другой результат получается ?
А в эмуляторе почему другой результат получается ?
По мне так в ПЛК как раз верный результат, а почему в эмуляторе другой - это вопрос к 3S-Smart Software.
Ну или у Пролога спросить https://forum-ru.codesys.com/viewforum.php?f=9&sid=e0d421f88637931d6a856006fd7177c0
По мне так в ПЛК как раз верный результат, а почему в эмуляторе другой - это вопрос к 3S-Smart Software.
Ну или у Пролога спросить https://forum-ru.codesys.com/viewforum.php?f=9&sid=e0d421f88637931d6a856006fd7177c0
А как из под функции ABS может вылезти отрицательное число ?
А как из под функции ABS может вылезти отрицательное число ?
Почему отрицательное?
ABS(65526) = 65526
Нет здесь отрицательного числа
А теперь приведите это число к формату переменной INT
Test:= WORD_TO_INT(65526);
Что получите?
Правильно -10
ЗЫ.
Учитывайте разрядную сетку и диапазон представления чисел в ЭВМ.
Это из серии
56000(WORD) + 30000(WORD) = 29464(WORD)
караул! почему 29464? Ведь должно быть 86000 !
Значит WORD в общем случае не может быть параметром функции ABS. Таблица не верна.
Значит WORD в общем случае не может быть параметром функции ABS. Таблица не верна.
Почему не может?
ABS(65526) = 65526 - что здесь не так? Аргумент функции ABS() не обязательно должен быть отрицательным.
Просто WORD не может быть отрицательным.
Если уж так хочется использовать в выражениях переменные различных форматов, то в кодесис есть операторы преобразования типов.
ABS(WORD_TO_INT(65536)) = ABS(-10) = 10.
Почему не может?
ABS(65526) = 65526 - что здесь не так? Аргумент функции ABS() не обязательно должен быть отрицательным.
Просто WORD не может быть отрицательным.
Если уж так хочется использовать в выражениях переменные различных форматов, то в кодесис есть операторы преобразования типов.
ABS(WORD_TO_INT(65536)) = ABS(-10) = 10.
Без костылей (WORD_TO_INT) использование в выражениях переменных различных форматов может дать неверный результат.
Почему не может?
ABS(65526) = 65526 - что здесь не так? Аргумент функции ABS() не обязательно должен быть отрицательным.
Просто WORD не может быть отрицательным.
Если уж так хочется использовать в выражениях переменные различных форматов, то в кодесис есть операторы преобразования типов.
ABS(WORD_TO_INT(65536)) = ABS(-10) = 10.
По хорошему разработчики прошивки ПЛК160 перед компиляцией исходного текста программы должны были сделать преобразование ABS(A-B) в ABS(WORD_TO_INT(A-B)). В эмуляторе это преобразование сделано поэтому результат там получается правильный при любом раскладе.
Проблема всего лишь в исходном коде программы, а именно в разделе объявления переменных
40224
Достаточно было СРАЗУ объявить T_v и T_z как INT, тем более,что в программе предполагалось вычитать одно из другого, из чего следует, что будут использоваться целые положительные, отрицательные и ноль, а не обезличенный WORD, который даже числом и не считается вовсе.
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot