Консультация № 192997
28.03.2018, 10:31
0.00 руб.
28.03.2018, 12:14
0 6 1
Здравствуйте!

Мне необходимо досконально разобраться с логикой этого примера
и применить эти шаблоны для строительства реальной системы

источник- https://simplight.ru/manual/komandy-raboty-s-globalnymi-peremennymi/flushglobalvarcache-



VALUE_Y' и VALUE_X - это измерительные каналы датчика
значения которых пишутся в и читаются с БД MS SQL

каналы Conn_status, result - диагнастические

моя задача записать значения и считать их за заданный промежуток времени

Прошу Вас поставить поясняющие комментарии в строках скрипта
у меня пока нет опыта в Pascal


[code lang=pascal h=350]var
ADOConnection: TADOConnection;
ADOQuery: TADOQuery;
ConnectionString: string;

VALUE_Y_tm:string;
VALUE_X_tm:string;
DT_XY:String;
tmptxt:String;

procedure Replace(var str, OldPattern, NewPattern: string);
var
ind: integer;
begin
ind := Pos(OldPattern, str);
if ind = 0 then
exit;
str[ind] := NewPattern;
end;

procedure OnStartScript;
begin
CoInitialize(nil);
ADOConnection := TADOConnection.Create(nil);
ADOQuery := TADOQuery.Create(nil);
end;

procedure OnStopScript;
begin
CoUninitialize;
ADOConnection.free;
ADOQuery.free;
end;


begin

try
ADOConnection.Connected := false;
ADOQuery.Active := false;
ADOConnection.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=True;User ID=testuser;Password=test;Initial Catalog=testDB;Data Source=DMITRYSIMP-PC\SQLEXPRESS;';
ADOQuery.Connection := ADOConnection;

VALUE_Y_tm:= floatToStr(ReadValue('VALUE_Y')); Replace(VALUE_Y_tm ,',','.');
VALUE_X_tm:= floatToStr(ReadValue('VALUE_X')); Replace(VALUE_X_tm ,',','.');
DT_XY:=FormatDateTime('yyyy-mm-dd hh:nn:ss', now);
Replace(DT_XY ,' ','T');

tmptxt:=Format('insert into Value_01(VALUE_Y, TIME_XY, VALUE_X) values (%s, ''%s'', %s)', [VALUE_Y_tm, DT_XY, VALUE_X_tm]);

ADOQuery.SQL.Text:= tmptxt;
ADOQuery.Active:=true;

finally

end;
end.[/code]



Второй скрипт


[code lang=pascal h=350]var
ADOConnection: TADOConnection;
ADOQuery: TADOQuery;
ConnectionString: string;
val: string;

procedure OnStartScript;
begin
CoInitialize(nil);
ADOConnection := TADOConnection.Create(nil);
ADOQuery := TADOQuery.Create(nil);
end;

procedure OnStopScript;
begin
CoUninitialize;
ADOConnection.free;
ADOQuery.free;
end;


begin

val:='';
WriteValue('Conn_status',0);

try
ADOConnection.Connected := false;
ADOQuery.Active := false;
ADOConnection.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=True;User ID=testuser;Password=test;Initial Catalog=testDB;Data Source=DMITRYSIMP-PC\SQLEXPRESS;';
ADOQuery.Connection := ADOConnection;
ADOQuery.SQL.Text := 'SELECT TOP 1000 [VALUE_Y],[TIME_XY],[VALUE_X] FROM [dbo].[Value_01]';

ADOQuery.Active:=true;

if ADOQuery.Active then
begin
WriteValue('Conn_status',1);

while ADOQuery.Eof = false do
begin
val := val+ ' VALUE_X='+floattostr(ADOQuery.FieldByName('VALUE_X').AsInteger);
val:= val+ ' TIME='+ ADOQuery.FieldByName('TIME_XY').AsString;
val:=val+chr(13);

ADOQuery.Next;
end;
WriteValue('result', val);
end
else begin
AddToDebugLog('fail SQL connection');
WriteValue('Conn_status',0);
end;

finally

end;
end.[/code]

Обсуждение

давно
Посетитель
401918
4
28.03.2018, 12:12
общий

Помогите пожалуйста адаптировать скрипт

var
ADOConnection: TADOConnection;
ADOQuery: TADOQuery;
ConnectionString: string;

VALUE_Y_tm:string;
VALUE_X_tm:string;
DT_XY:String;
tmptxt:String;

procedure Replace(var str, OldPattern, NewPattern: string);
var
ind: integer;
begin
ind := Pos(OldPattern, str);
if ind = 0 then
exit;
str[ind] := NewPattern;
end;

procedure OnStartScript;
begin
CoInitialize(nil);
ADOConnection := TADOConnection.Create(nil);
ADOQuery := TADOQuery.Create(nil);
end;

procedure OnStopScript;
begin
CoUninitialize;
ADOConnection.free;
ADOQuery.free;
end;


begin

try
ADOConnection.Connected := false;
ADOQuery.Active := false;
ADOConnection.ConnectionString := 'Provider=DIAR;Persist Security Info=True;User ID=sa;Password=Wth,th006;Initial Catalog=MonitoringStudio.MonitoringClient;Data Source=S702IS-SMIS\SQLEXPRESS;';
ADOQuery.Connection := ADOConnection;

VALUE_Y_tm:= floatToStr(ReadValue('VALUE_Y')); Replace(VALUE_Y_tm ,',','.');
VALUE_X_tm:= floatToStr(ReadValue('VALUE_X')); Replace(VALUE_X_tm ,',','.');
DT_XY:=FormatDateTime('yyyy-mm-dd hh:nn:ss', now);
Replace(DT_XY ,' ','T');

tmptxt:=Format('insert into Value_01(VALUE_Y, TIME_XY, VALUE_X) values (%s, ''%s'', %s)', [VALUE_Y_tm, DT_XY, VALUE_X_tm]);

ADOQuery.SQL.Text:= tmptxt;
ADOQuery.Active:=true;

finally

end;
end.

к записи в таблицу

USE [MonitoringStudio.MonitoringClient]
GO

/****** Object: Table [dbo].[DataExchange] Script Date: 28.03.2018 11:19:05 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[DataExchange](
[Id] [int] IDENTITY(1,1) NOT NULL,
[TagValue] [float] NOT NULL,
[TagName] [nvarchar](50) NOT NULL,
[Timestamp] [datetime] NOT NULL,
CONSTRAINT [PK_DataExchange] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[DataExchange] ADD CONSTRAINT [DF__DataExcha__Times__0425A276] DEFAULT (getdate()) FOR [Timestamp]
GO

значение TagName можно задать в скрипте


мой вариант спотыкается на строке --- procedure Replace(var str, OldPattern, NewPattern: string);
пишет - Строка:13 Ошибка: ';' expected
но я ничего не менял в этом месте


var
ADOConnection: TADOConnection;
ADOQuery: TADOQuery;
ConnectionString: string;

VALUE_Y_tm:string;
VALUE_X_tm:string;
DT_XY:String;
TagName_Y_tm:String;
TagName_X_tm:String;
tmptxt_X:String;
tmptxt_Y:String

procedure Replace(var str, OldPattern, NewPattern: string);
var
ind: integer;
begin
ind := Pos(OldPattern, str);
if ind = 0 then
exit;
str[ind] := NewPattern;
end;

procedure OnStartScript;
begin
CoInitialize(nil);
ADOConnection := TADOConnection.Create(nil);
ADOQuery := TADOQuery.Create(nil);

end;

procedure OnStopScript;
begin
CoUninitialize;
ADOConnection.free;
ADOQuery.free;
end;


begin

try
ADOConnection.Connected := false;
ADOQuery.Active := false;
ADOConnection.ConnectionString := 'Provider=DIAR;Persist Security Info=True;User ID=sa;Password=Wth,th006;Initial Catalog=MonitoringStudio.MonitoringClient;Data Source=S702IS-SMIS\SQLEXPRESS;';
ADOQuery.Connection := ADOConnection;

TagName_Y_tm:= 'Èí_29_Y' ;
TagName_X_tm:= 'Èí_29_X' ;

VALUE_Y_tm:= floatToStr(ReadValue('VALUE_Y')); Replace(VALUE_Y_tm ,',','.');
VALUE_X_tm:= floatToStr(ReadValue('VALUE_X')); Replace(VALUE_X_tm ,',','.');
DT_XY:=FormatDateTime('yyyy-mm-dd hh:nn:ss', now);
Replace(DT_XY ,' ','T');

tmptxt_X:=Format('insert into DataExchange(TagValue, TagName, Timestamp) values (%s, ''%s'', %s)', [VALUE_X_tm, TagName_X_tm, DT_XY]);
tmptxt_Y:=Format('insert into DataExchange(TagValue, TagName, Timestamp) values (%s, ''%s'', %s)', [VALUE_Y_tm, TagName_Y_tm, DT_XY]);



ADOQuery.SQL.Text:= tmptxt_X;
ADOQuery.SQL.Text:= tmptxt_Y;
ADOQuery.Active:=true;

finally

end;
end.

давно
Старший Модератор
31795
6196
28.03.2018, 12:34
общий
Адресаты:
Цитата: helic
у меня пока нет опыта в Pascal

Не Pascal, а Delphi, который, только предоставляет инструменты для работы с базами данных. Если Вы хотите досконально разобраться, то Вам нужно изучить технологию ActiveX от MS.
Что именно Вам не понятно?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
401918
4
28.03.2018, 12:54
общий

Приветствую!

В настоящий момент не могу получить соединение с ODBC

ADOConnection.ConnectionString := 'Provider=DIAR;Persist Security Info=True;User ID=sa;Password=Wth,th006;Initial Catalog=MonitoringStudio.MonitoringClient;Data Source=S702IS-SMIS\SQLEXPRESS;';

строка - ;Initial Catalog=MonitoringStudio.MonitoringClient; вызывает сомнения
Прикрепленные файлы:
6cf46e2fc8a5fe0c01523b84ab80b436.png
давно
Посетитель
401918
4
28.03.2018, 14:17
общий
помоги пожалуйста разобраться

Скрипт компилируется но дает ошибку

28.03.2018 13:51:34.707 Неправильный синтаксис около конструкции "T13@P1" - [insert]

что она означает ?
я пытаюсь этим скриптом записать значения двух каналов в таблицу

USE [simp]
GO

/****** Object: Table [dbo].[DataExchange] Script Date: 28.03.2018 13:59:38 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[DataExchange](
[Id] [int] IDENTITY(1,1) NOT NULL,
[TagValue] [float] NOT NULL,
[TagName] [nvarchar](50) NOT NULL,
[Timestamp] [datetime] NOT NULL,
CONSTRAINT [PK_DataExchange] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[DataExchange] ADD CONSTRAINT [DF__DataExcha__Times__0425A276] DEFAULT (getdate()) FOR [Timestamp]
GO


СКРИПТ



var
ADOConnection: TADOConnection;
ADOQuery: TADOQuery;
ConnectionString: string;

VALUE_Y_tm:string;
VALUE_X_tm:string;
DT_XY:String;
TagName_Y_tm:String;
TagName_X_tm:String;
tmptxt_X:String;
tmptxt_Y:String;

procedure Replace(var str, OldPattern, NewPattern: string);
var
ind: integer;
begin
ind := Pos(OldPattern, str);
if ind = 0 then
exit;
str[ind] := NewPattern;
end;

procedure OnStartScript;
begin
CoInitialize(nil);
ADOConnection := TADOConnection.Create(nil);
ADOQuery := TADOQuery.Create(nil);

end;

procedure OnStopScript;
begin
CoUninitialize;
ADOConnection.free;
ADOQuery.free;
end;


begin

try
ADOConnection.Connected := false;
ADOQuery.Active := false;
// ADOConnection.ConnectionString := 'Provider=DIAR;Persist Security Info=True;User ID=sa;Password=Wth,th006;Initial Catalog=MonitoringStudio.MonitoringClient;Data Source=S702IS-SMIS\SQLEXPRESS;';
ADOConnection.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Password=Wth,th006;Initial Catalog=simp;Data Source=S702IS-SMIS\SQLEXPRESS;';
ADOQuery.Connection := ADOConnection;

TagName_Y_tm:= 'In_29_Y' ;
TagName_X_tm:= 'In_29_X' ;

VALUE_Y_tm:= floatToStr(ReadValue('VALUE_Y')); Replace(VALUE_Y_tm ,',','.');
VALUE_X_tm:= floatToStr(ReadValue('VALUE_X')); Replace(VALUE_X_tm ,',','.');
DT_XY:=FormatDateTime('yyyy-mm-dd hh:nn:ss', now);
Replace(DT_XY ,' ','T');

tmptxt_X:=Format('insert into DataExchange(TagValue, TagName, Timestamp) values (%s, ''%s'', %s)', [VALUE_X_tm, TagName_X_tm, DT_XY]);
tmptxt_Y:=Format('insert into DataExchange(TagValue, TagName, Timestamp) values (%s, ''%s'', %s)', [VALUE_Y_tm, TagName_Y_tm, DT_XY]);



ADOQuery.SQL.Text:= tmptxt_X;
ADOQuery.SQL.Text:= tmptxt_Y;
ADOQuery.Active:=true;

finally
// AddToDebugLog('fail SQL connection');
// WriteValue('Conn_status',2);

end;
end.
давно
Посетитель
401918
4
28.03.2018, 16:54
общий

Структура таблицы

CREATE TABLE [dbo].[DataExchange](
[Id] [int] IDENTITY(1,1) NOT NULL,
[TagValue] [float] NOT NULL,
[TagName] [nvarchar](50) NOT NULL,
[Timestamp] [datetime] NOT NULL,

Скрипт

var
ADOConnection: TADOConnection;
ADOQuery: TADOQuery;
ConnectionString: string;

VALUE_Y_tm:string;
VALUE_X_tm:string;
DT_XY:string;

TagName_Y_tm:string;
TagName_X_tm:string;
tmptxt_X:string;
tmptxt_Y:string;
procedure Replace(var str, OldPattern, NewPattern: string);
var
ind: integer;
begin
ind := Pos(OldPattern, str);
if ind = 0 then
exit;
str[ind] := NewPattern;
end;

procedure OnStartScript;
begin
CoInitialize(nil);
ADOConnection := TADOConnection.Create(nil);
ADOQuery := TADOQuery.Create(nil);
//TagName_Y_tm:= 'Teg_29Y';
TagName_X_tm:= 'Teg';

end;

procedure OnStopScript;
begin
CoUninitialize;
ADOConnection.free;
ADOQuery.free;
end;


begin

try
ADOConnection.Connected := false;
ADOQuery.Active := false;
ADOConnection.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Password=Wth,th006;Initial Catalog=simp;Data Source=S702IS-SMIS\SQLEXPRESS;';
ADOQuery.Connection := ADOConnection;

VALUE_Y_tm:= floatToStr(ReadValue('VALUE_Y')); Replace(VALUE_Y_tm ,',','.');
VALUE_X_tm:= floatToStr(ReadValue('VALUE_X')); Replace(VALUE_X_tm ,',','.');
DT_XY:=FormatDateTime('yyyy-mm-dd hh:nn:ss', now);
Replace(DT_XY ,' ','T');

// tmptxt_X:=Format('insert into DataExchange(TagValue, Timestamp ) values (%s, ''%s'')', [VALUE_X_tm, DT_XY]);
tmptxt_X:=Format('insert into DataExchange(TagValue, Timestamp, TagName) values (%s, ''%s'', %s)', [VALUE_X_tm, DT_XY, TagName_X_tm]);
// tmptxt_Y:=Format('insert into DataExchange(TagValue, TagName, Timestamp) values (%s, ''%s'', %s)', [VALUE_Y_tm, TagName_Y_tm, DT_XY]);

ADOQuery.SQL.Text:= tmptxt_X;
// ADOQuery.SQL.Text:= tmptxt_Y;
ADOQuery.Active:=true;

finally

end;
end.

Дает ошибку " 28.03.2018 16:53:02.253 Недопустимое имя столбца "Teg" - [insert]"

почему ?

давно
Старший Модератор
31795
6196
06.04.2018, 16:13
общий
это ответ
Здравствуйте, helic!

Экспертов по SKADA SIMP Light, на портале нет. Несмотря,на то, что эта система использует pascal-подобные скрипты, они далеки от языка программирования: Pascal / Delphi / Lazarus.

Скачал, поставил, "балуюсь" с системой. И это весь мой экспертный уровень.
Обратитесь в службу поддержки, по отзывам, она работает нормально и помогает.
Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа