Страница 166 из 250

Re: EasyBuilder - Скорая помощь новичкам

СообщениеДобавлено: 01 дек 2021, 16:45
tangra.god
Добрый день!
Подскажите пожалуйста, как правильно подключить две панели Weintek к одному плк S-1200

Re: EasyBuilder - Скорая помощь новичкам

СообщениеДобавлено: 01 дек 2021, 17:30
Gray-Gray
test.test писал(а):пока мы находимся на первом экране ,кнопка перехода на первый экран становиться зеленого цвета

у вас получилось расположить на экране такую кнопку?

Re: EasyBuilder - Скорая помощь новичкам

СообщениеДобавлено: 01 дек 2021, 19:32
tangra.god
tangra.god писал(а):Добрый день!
Подскажите пожалуйста, как правильно подключить две панели Weintek к одному плк S-1200

Узнал, что при подключении 2ух панелей к ПЛК S-1200, по собственному протоколу Сименс, проблем не возникнет, т.к. ПЛК поддерживает до 2ух панелей.
Для общего развития, расскажите пожалуйста, как можно реализовать систему где нужно больше 2ух панелей Weintek (например 5)

Re: EasyBuilder - Скорая помощь новичкам

СообщениеДобавлено: 02 дек 2021, 03:24
ArtemPM
Gray-Gray писал(а):Здравствуйте.
Имеется блок данных ПЛК в котором каждый бит вызывает всплывающее сообщение на панели оператора. Самый простой способ использовать нужное кол-во объектов Direct Window со стилем Popup window и экранов с сообщениями.
Есть ли другие варианты всплывающих сообщений?

Самый простой способ использовать битовый индикатор с пустым нулевым состоянием.

Re: EasyBuilder - Скорая помощь новичкам

СообщениеДобавлено: 02 дек 2021, 14:18
Number17
ArtemPM писал(а):
Number17 писал(а):При определении тегов вроде как ставиться двоеточие, и тут по аналогии.

Вы что-то путаете. Двоеточие не ставится ни где. Возможно в определении тегов такая конструкция и работает, как работают и точка и запятая, но макросы в этом плане строже.


В определении тегов точно работает.
Изображение

Re: EasyBuilder - Скорая помощь новичкам

СообщениеДобавлено: 03 дек 2021, 08:32
dikh
Добрый день.
Пытаюсь пересчитать температуру в давление с помощью следующего кода:
Код: Выделить всё
macro_command main()

int a
float i, j

GetData(a, "Local HMI", LW, 501, 1)
//считываем значение в формате -1058, фактическое -10.58
j = a / 100

i = (0.00000005*j*j*j*j + 0.00001347*j*j*j + 0.00228302*j*j + 0.19636593*j + 5.32258081)

//полученное значение фактическое -10.58, переводим в формат -1058
a = i * 100

SetData(a, "Local HMI", LW, 502, 1)

end macro_command

Код работает отлично когда а > 0, но когда a становится отрицательной величиной код генерирует “мусор”. Что нужно сделать чтобы макрос правильно рассчитывал?

Re: EasyBuilder - Скорая помощь новичкам

СообщениеДобавлено: 03 дек 2021, 10:59
Number17
dikh писал(а):Добрый день.
Пытаюсь пересчитать температуру в давление с помощью следующего кода:
Код: Выделить всё
macro_command main()

int a
float i, j

GetData(a, "Local HMI", LW, 501, 1)
//считываем значение в формате -1058, фактическое -10.58
j = a / 100

i = (0.00000005*j*j*j*j + 0.00001347*j*j*j + 0.00228302*j*j + 0.19636593*j + 5.32258081)

//полученное значение фактическое -10.58, переводим в формат -1058
a = i * 100

SetData(a, "Local HMI", LW, 502, 1)

end macro_command

Код работает отлично когда а > 0, но когда a становится отрицательной величиной код генерирует “мусор”. Что нужно сделать чтобы макрос правильно рассчитывал?


Возможно дело в типах данных и их неявном преобразовании. а у вас int, остальное float. В экселе ваши формулы вроде как адекватно считаются.

Re: EasyBuilder - Скорая помощь новичкам

СообщениеДобавлено: 03 дек 2021, 11:20
ArtemPM
dikh писал(а):Добрый день.
Пытаюсь пересчитать температуру в давление с помощью следующего кода:

Код работает отлично когда а > 0, но когда a становится отрицательной величиной код генерирует “мусор”. Что нужно сделать чтобы макрос правильно рассчитывал?

Как уже было сказано ранее - неявное преобразование типов играет против вас в строке:
Код: Выделить всё
j = a / 100

Попробуйте заменить эту конструкцию на
Код: Выделить всё
j = a / 100.0

Так компилятор поймет, что необходимо результат деления записать как Float.
Вот из мануала текст:
By default, integer numbers (1, 2,3..etc) are considered having integer data type; therefore,
when division is carried out involving two integer numbers where the result should have
decimal point, the decimal part will be removed. To avoid this, add .0 (1.0, 2.0, 3.0...etc) behind
the dividend or the divisor to turn it into a floating point number calculation.
Examples:
A = 3 / 2 = 1 » 3 and 2 are both integers; therefore the result is an integer.
B = 3 / 2.0 = 1.5 » 3 is an integer whereas 2.0 is a floating point number, therefore the
result is a floating point number.
C = 3.0 / 2 = 1.5 » 3.0 is a floating point number whereas 2 is an integer, therefore the
result is a floating point number.

Ну и еще для гарантий в строке 13 напишите:
Код: Выделить всё
a = ROUND(i * 100)

Re: EasyBuilder - Скорая помощь новичкам

СообщениеДобавлено: 03 дек 2021, 12:51
dikh
ArtemPM писал(а):
dikh писал(а):Добрый день.
Пытаюсь пересчитать температуру в давление с помощью следующего кода:

Код работает отлично когда а > 0, но когда a становится отрицательной величиной код генерирует “мусор”. Что нужно сделать чтобы макрос правильно рассчитывал?

Как уже было сказано ранее - неявное преобразование типов играет против вас в строке:
Код: Выделить всё
j = a / 100

Попробуйте заменить эту конструкцию на
Код: Выделить всё
j = a / 100.0

Так компилятор поймет, что необходимо результат деления записать как Float.
Вот из мануала текст:
By default, integer numbers (1, 2,3..etc) are considered having integer data type; therefore,
when division is carried out involving two integer numbers where the result should have
decimal point, the decimal part will be removed. To avoid this, add .0 (1.0, 2.0, 3.0...etc) behind
the dividend or the divisor to turn it into a floating point number calculation.
Examples:
A = 3 / 2 = 1 » 3 and 2 are both integers; therefore the result is an integer.
B = 3 / 2.0 = 1.5 » 3 is an integer whereas 2.0 is a floating point number, therefore the
result is a floating point number.
C = 3.0 / 2 = 1.5 » 3.0 is a floating point number whereas 2 is an integer, therefore the
result is a floating point number.

Ну и еще для гарантий в строке 13 напишите:
Код: Выделить всё
a = ROUND(i * 100)

Не помогло(((
Код: Выделить всё
macro_command main()

int a
float i, j

GetData(a, "Local HMI", LW, 501, 1)
//считываем значение в формате -1058, фактическое -10.58
j = a / 100.0

i = (0.00000005*j*j*j*j + 0.00001347*j*j*j + 0.00228302*j*j + 0.19636593*j + 5.32258081)

//полученное значение фактическое -10.58, переводим в формат -1058
j = i * 100.0

a = j

SetData(a, "Local HMI", LW, 502, 1)

end macro_command

Re: EasyBuilder - Скорая помощь новичкам

СообщениеДобавлено: 03 дек 2021, 13:12
Number17
dikh писал(а)://полученное значение фактическое -10.58, переводим в формат -1058
j = i * 100.0

a = j


Вы вот тут переменной типа int присваиваете значение типа float.
Посмотрите через TRACE значения переменных на всех этапах вычисления.

Код: Выделить всё
//полученное значение фактическое -10.58, переводим в формат -1058
j = i * 100.0

TRACE( "j = %f", j )

a = j

TRACE( "a = %d", a )



Если значение j адекватное, то дело в присвоении a = j. Если нет, то ищите подобным способом выше где прокол.