У меня есть приложение с потоком для использования OPC. этот поток делает связь с OPC Factory Server и получает уведомление об автоматизации.Как хорошо общаться с OPC?
OPC: v 3.40.2808.0
языка сайта: Pascal, IDE: Delphi XE 2
связь с сервером хорошо и уведомление пришедшего. но время от времени, обслуживание не совсем и мое приложение не получает все уведомления.
Я не уверен, что этот вопрос пришел из моего кода, но для объяснения мало:
GestOPC = class(TThread)
contructor Create(suspendu:boolean);
destructor Destroy;override;
procedure C******; // Called by connexion
private
procedure Execute;override;
procedure CallGestOPCMainLabelAtt(const s : string);// IU Calling
procedure Call****;
procedure Call****;
procedure Call****;
public
sCallIHM :string;
***: boolean;
***: LongInt;
ThreadListNotif: TThreadList,
ServeurIF : OPCServer;
OPCDataCallBack:IOPCDataCallBack;
Buffer_notif : ^TNotif;
procedure connexion;
end;
TOPCDataCallback = class (TInterfacedObject, IOPCDataCallback)
public
function OnDataChange(.....)HResult;stdcall;
function OnReadComplete(.....)HResult;stdcall;
function OnWriteComplete(.....)HResult;stdcall;
function OnCancelComplete(.....)HResult;stdcall;
end;
OnDataChange ниток OPC в: Это событие для получения уведомления
function TOPCDataCallback.OnDataChange (dwTransid : DWORD; hgroup:OPCHANDLE; hrMasterquality: HResult;
hrMastererror : HResult;dwCount : DWORD;phClientItems:POPCHANDLEARRAY;pvValues: POleVariantArray;
pwQualities:PWordArray; pftTimeStamps : PFileTimeArray; pErrors :PResultList): HResult;
var
ClientItems :POPCHANDLEARRAY;
Values: POleVariantArray;
Qualities : PWordArray;
i,iCountBadItem:integer;
Begin
if not bClosing then ///It's to not do anything if the app is closing.
begin
//Initialisation
iCountBadItem := 0; //this is for count during debbugging all notification unreadable
Result := s_OK;
ClientItems := POPCHANDLEARRAY (phClientItems);
Values := POleVariantArray(pvValues);
for i := 0 to dwCount -1 do
begin
if Qualities[i] = OPC_QUALITY_GOOD then
begin
new(ClientOPC.Buffer_notif);
ClientOPC.Buffer_notif^.groupe_handle.indice_type1 := hGroup;
ClientOPC.Buffer_notif^.item_client := ClientItems[i];
ClientOPC.Buffer_notif^.valeur_item := Value[i];
ClientOPC.ThreadListNotif.Add(ClientOPC.Buffer_Notif);
//This list is used in another Thread with LockList for use the notification.
end
else
iCountBadItem := iCountBadItem+1;
end;
end;
Моя процедура Execute от резьбы OPC нет, чтобы быть уверенным, что у меня хороший прием:
procedure GestOPC.Execute;
begin
NameThreadForDebugging('GestOPC');
while (not Terminated) do
begin
sleep(100);
end;
end;
Мой поток создается событие FormCreate моей основной формы с:
ClientOPC := GestOPC.Create(false);
ClientOPC.FreeOnTerminate := false;
И связь является запуск через А ButtonClick»Событие:
ClientOPC.Connexion;
Функция связь начал создавать приемник TOPCDataCallBack, сделать соединение с Ofs, сделать SQL-вызов в базе данных и завершить динамическую модификацию моего интерфейса (причина, по которой OPC находится в потоке, - это не заморозить мой интерфейс во время соединения).
Для моего IU Calling я использовать эту структуру:
sCallIHM := "Ceci est un exemple de mon travail ;) ";
Queue(
procedure
begin
CallGestOPCMainLabelAtt(sCallIHM);
end) ;
Как я могу обновить что быть Сюр, чтобы получить все мое сообщение?
Спасибо за чтение =)
Извините, что я нищий ^^ ' – Guillaume
@Guillaume Не сожалею. Один из самых важных уроков при запуске - не пытаться делать слишком много сразу - иначе вы в конце концов утонете в проблемах, которые вы не понимаете. Начните с простого решения и сначала запустите его, затем добавьте сложность позже. –
Извините, что я новичок ^^ 'Но «Не вызывайте очередь из основного потока», я не использую это в основном потоке, нет? Сначала это применимо, это многопоточное приложение, которое я должен обновить для передачи в MQTT Communication. Я не синхронизирую, чтобы не замораживать мой поток при модификации IU. Итак, если я хорошо понимаю, я беру свою связь и свою OPCDataCallBack и помещаю ее в свой основной поток? Моя проблема, если я делаю это вызовом SQL, слишком долгое и очень долгое замораживание моего пользовательского интерфейса. После создания этой темы, это действительно изменит замораживание, и это очень приятно. извините за мой английский .. (этот веб-сайт шутит с редактированием ^^) – Guillaume