Скажите как объявить переменные с типом Variant и Long в 1С:
Dim SHandles(2) As Long 'parameter value
Dim Values() As Variant 'return value
Dim Errors() As Long 'return value
Dim Qual As Variant 'return value
Dim TS As Variant 'return value
Dim i As Integer
'save ServerHandles
SHandles(1) = MyOPCItems(1).ServerHandle
SHandles(2) = MyOPCItems(2).ServerHandle
Call MyOPCGroup.SyncRead(OPCCache, 2, SHandles, Values, Errors, Qual, TS)
Ошибка, как я понял, в инициализации Variant переменных (Values и Errors) через массив ComSafeArray
Вот участок кода из Excel:
Dim SHandles(2) As Long 'parameter value
Dim Values() As Variant 'return value
Dim Errors() As Long 'return value
Dim Qual As Variant 'return value
Dim TS As Variant 'return value
Dim i As Integer
'save ServerHandles
SHandles(1) = MyOPCItems(1).ServerHandle
SHandles(2) = MyOPCItems(2).ServerHandle
Call MyOPCGroup.SyncRead(OPCCache, 2, SHandles, Values, Errors, Qual, TS)
Показать
Вот типы из Delphi:
ReadOPCGroupItemValue(GroupIf, Item0Handle, ItemValue, ItemQuality)
// wrapper for IOPCSyncIO.Read (single item only)
function ReadOPCGroupItemValue(GroupIf: IUnknown; ItemServerHandle: OPCHANDLE;
var ItemValue: string; var ItemQuality: Word): HResult;
ItemValues: POPCITEMSTATEARRAY;
POPCITEMSTATEARRAY = ^OPCITEMSTATEARRAY;
OPCITEMSTATEARRAY = array[0..65535] of OPCITEMSTATE;
OPCITEMSTATE = record
hClient: OPCHANDLE;
ftTimeStamp: TFileTime;
wQuality: Word;
wReserved: Word;
vDataValue: OleVariant;
end;
OPCHANDLE = DWORD;
DWORD = LongWord;
TFileTime = _FILETIME;
_FILETIME = record
dwLowDateTime: DWORD;
dwHighDateTime: DWORD;
end;
Показать
Кто-нибудь может помочь правильно написать в 1С строчки:
Values = Новый ComSafeArray("VT_I4", 2);
Errors = Новый ComSafeArray("VT_I4", 2);
Насколько я понял, достаточно сконфигурировать обычный компьютер как OPC-сервер
и можно получить необходимые фактические данные из производства (без SCADA).
Так как OPC DA/HDA являются COM-объектами (Siemens OPC DA Automation 2.0), то можно без проблем обратится к ним из 1С.
Вот пример реализации: http://1c-opc.ru/.
Вот к UA обращаться совсем не проблема, ибо web-services. В крайнем случае делается COM-обертка над их .Net компонентами.
А общаться напрямую через OPC-сервер имеет смысл только если у нас в производстве эти датчики занимаются только отдачей информации и не больше. Как только у нас контроллеры начинают двигать задвижки, изменять напряжений и т.п. - 1с должна отползти в сторону и дергать только скаду.
MES не будет брать на себя куски скады - не для того делалось :), он и MES-функционал не закрывает полностью. На сейчас это просто заготовка для дальнейшего запила при внедрении - вот на этом этапе и имеет смысл делать для него свои модули.
Variant - это любой тип, в 1с и так все переменные этого типа
Long - длинное целое число, скорее всего 32-битное, судя по VB, при передаче числовой переменной через COM интерфейсы 1с сама его к Long попытается преобразовать, если интерфейс этого требует.
{Обработка.opc.Форма.Форма.Форма(47)}: Ошибка при вызове метода контекста (SyncRead)
opcGroup1.SyncRead(OPC_DS_CACHE, 1, ServerHandles, Values, Errors, Qual, TS);
по причине:
Типы не совпадают (4)
Типы не совпадают (4)
Насколько я понимаю, то тут так должно быть:
Values = ComSafeArray("VT_VARIANT", 1); и начальное заполнение делаться не должно, т.к. VT_VARIANT преобразуется в Число. Либо Values.SetValue(0, ""); если враппер из дельфи не врет о типах.
Errors = Новый ComSafeArray("VT_I4", 1);
Либо вообще Values и Errors должны быть безразмерными массивами: Values = ComSafeArray("VT_VARIANT"); Errors = Новый ComSafeArray("VT_I4");
Также можно попробовать для Values тип VT_BSTR, так как во враппере дельфи именно тип String указан.
добрый день.
Необходимо получить данные с OPC DA. Делаю Com-соединение. Добавляю группу и параметры, которые необходимо получить. Но возникают проблемы с определением типов аргументов для метода SyncRead. Может кто помочь как определить тип данных Long и Variant?
Может вообще что то делаю не так?