Вопросы по скриптам в Simple-Scada 2

Автор Simple-Scada, 29 января 2016, 15:19:20

Simple-Scada

Здравствуйте.

Все семь пунктов недоступны. Все-таки компилятор скриптов это не полноценная среда разработки. Программа управления обычно реализуется на контроллерах, что позволяет убрать зависимость работы тех. процессов от работы скады, а в скриптах скады используются либо готовые методы, либо пишутся свои для простой визуализации. При этом мы хорошо понимаем, что описанные Вами функции будут очень полезны даже при решении небольших задач, поэтому пункты 1, 2, 4 (касаемо глобальных классов) и 7 будут реализованы в будущих обновлениях. Пункты 3, 5 и 6 пока не планируются.

ksapp

Понял. Спасибо. Можно, конечно, без этого обойтись. Но новых версий будем ждать ))) И про редактор не забудьте. Всё-таки не очень удобно случайно удалив кусок кода не иметь возможности отменить это действие.

ksapp

Ещё вопрос. Правда не по скриптам.
Не могу ввести в поле (вручную) значение больше 100. В свойствах поля стоит параметр "Максимум" 100. В документации сказано, что этот параметр изменяется в редакторе переменных. Но там я такого параметра не нашёл. Там есть границы, но это, как я понимаю, не "Максимум". В чём может быть причина?

Simple_Scada

Здравствуйте!

Этот вопрос рассмотрен в разделе FAQ - пятое сообщение.

Teodor

Цитата: ksapp от 30 марта 2017, 11:44:44Понял. Спасибо. Можно, конечно, без этого обойтись. Но новых версий будем ждать ))) И про редактор не забудьте. Всё-таки не очень удобно случайно удалив кусок кода не иметь возможности отменить это действие.
Перед редактированием скриптов сохраняйтесь... ф9 кроме компиляции сохраняет скрипт... В случае аврала снимаете процесс и запускаете по новой... Сохранится последняя компиляция :)

ksapp

Здравствуйте снова.
Видимо, какое-то время ещё буду надоедать вам, пока не освоюсь  :)
Вопрос такой: есть процедура (см. код), которая должна возвращать значение в глобальную переменную. Но этот код выдаёт ошибку. Хотя при использовании локальной переменной всё компилируется нормально. Как решить эту проблему?

Код: pascal
var z : byte;

procedure Test(var x : byte);
begin
  x := 1;
end;

//------------------------------------------------------------------------------------------------------
// ОСНОВНОЙ СЦЕНАРИЙ
//------------------------------------------------------------------------------------------------------
begin
  
  Test(z);  //Компилируется
  Test(BIT_0.Value );  //Не компилируется (BIT_0 - глобальная переменная типа byte)
  //Сообщение об ошибке: [uGlobal] Types of actual and formal var parameters must be identical 

end.      

Teodor

Test(BIT_0.Value )

Test(BIT_0.AsInt) пробовали?

ksapp

Пробовал с AsInt и с OriginalAsInt. Тоже не компилируется. Причём с объектами, связанными с графикой (например, с TM_Image вместо Byte) подобная процедура работает нормально. А вот с глобальными переменными не получается. Может это связано с ограничениями бесплатной версии? Хотя вроде как ограничения касаются только баз данных и файлов.

Teodor

#263
Тогда еще вопрос, вам критичен именно байт, как параметр? Если вопрос не в ограничении размеров, то можно и даже нужно передать ВСЮ "переменную":

Код: pascal
procedure Test(var x :TM_Variable);
begin
  x.Value   := 1;

end;

//------------------------------------------------------------------------------------------------------
// ОСНОВНОЙ СЦЕНАРИЙ
//------------------------------------------------------------------------------------------------------
begin

  Test(Тest3 );  

end.

если надо именно байт, то так:

Код: pascal
var
  i:byte;

procedure Test(var x : byte);
begin
  x := 1;
end;

//------------------------------------------------------------------------------------------------------
// ОСНОВНОЙ СЦЕНАРИЙ
//------------------------------------------------------------------------------------------------------
begin

  i:=Тest3.Value;
  Test(i);

 end.

TeNQ

#264
Код: pascal
var z : byte;

procedure Test(var x : byte);
begin
  x := 1;
end;

//------------------------------------------------------------------------------------------------------
// ОСНОВНОЙ СЦЕНАРИЙ
//------------------------------------------------------------------------------------------------------
begin

  z := BIT_0.AsInt
  Test(z);
  BIT_0.Value := z;

end.                         
Я бы попробовал так. Дело тут не в демо версии. А в несоответствии типов. Процедура принимает тип Byte. AsInt возвращает переменную типа Integer, что шире типа Byte. Вот и ругается компилятор. Поэтому надо явно довести тип Integer до типа Byte. Поэтому воспользоваться вашей процедурой можно только через локальную переменную-буфер, потому что метода AsByte для глобальной переменной нет)

Teodor

Цитата: TeNQ от 31 марта 2017, 14:44:26Процедура принимает тип Byte. AsInt возвращает переменную типа Integer, что шире типа Byte. Вот и ругается компилятор. Поэтому надо явно довести тип Integer до типа Byte. А это пока видимо можно сделать только через присвоение локальной переменной вашей глобальной переменной, потому что метода AsByte нет)
А ну задайте-ка инты и там и там? :)

Simple-Scada

#266
Как правильно заметил TeNQ есть несоответствие типов byte и integer. Всё дело в том, что в подпроцедуре Test параметр задан с меткой var. Это передача параметра по-ссылке и она требует строгого соответствия типов данных. Поэтому нужно делать как написал TeNQ. Либо менять тип параметра в подпроцедуре на Integer.

Teodor

#267
Цитата: Simple-Scada от 31 марта 2017, 15:00:51Как правильно заметил TeNQ есть несоответствие типов byte и integer. Всё дело в том, что в подпроцедуре Test параметр задан с меткой var. Это передача параметра по-ссылке и она требует строгого соответствия типов данных. Поэтому нужно делать как написал TeNQ.
Окей. А если в процедуре указать Single, и воспользоваться методом .AsSingle переменной, то получится ли строгое совпадение типов? НЕТ...

Можно лечить? Да!
Код: pascal
procedure Test(x : byte);
begin
  x := 1;
end;

begin
  Test (Test3.AsInt64);
end.
Спокойно компилится  ;D

Что не так? А то что мы НЕ создавали переменную х, а просто связали ее со значением BIT_0.Value, которое очень даже может не совпадать... Или, если попроще, то var убрали из объявления...

Simple-Scada

#268
ЦитироватьА если в процедуре указать Single, и воспользоваться методом .AsSingle переменной, то получится ли строгое совпадение типов? НЕТ...
Оно получится, но нужно будет писать также как писали в примере выше, через отдельную переменную, т.к. нужно передавать ссылку:

Код: pascal
var
  X: Single;
begin
  X := vrMy.AsSingle;
  Test(X);
end;

ЦитироватьМожно лечить? Да! Спокойно компилится
Конечно компилится, т.к. параметр больше не передается по ссылке, но подпроцедура теряет смысл и код свою задачу выполнять не будет, т.к. в подпроцедуре будет создана новая локальная переменная и значение равное 1 будет задано именно для неё, а не для той переменной, которая была передана в подпроцедуру.

Код: pascal
procedure Test(x : byte);
begin
  x := 1;
end;

begin
  Test(Test3.AsInt64);
  // здесь переменная Test3 будет равна тому же, чему была равна до выполнения Test, 
  // т.к. в подпроцедуре работа велась с локальной копией.
end.

Teodor

#269
А я ее и не собирался возвращать  ;D

но тогда уже так:
Код: pascal
var
  X: Single;
begin
  X := vrMy.AsSingle;
  Test(X);
  vrMy.Value:= X; // иначе, ничем от того что написал я, оно не отличается
end;

А так как я с саааамого начала написал нельзя? В плане передачи сразу ТМ_Variable и не плясать с бубном ?