1С:MES Оперативное управление производством

1. okulus 23.05.14 14:31 Сейчас в теме
Процессное производство -> 1С:MES -> OPC DA/HDA, лучше OPC UA -> Sienems Simatic PLC

Предлагаю обсудить технические вопросы, обменяться опытом реализации описанной схемы автоматизации предприятия.
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nickpugachev 23.05.14 14:46 Сейчас в теме
вот только вместо OPC у вас встанет конкретная SCADA, с которой и будете общаться.
ну или писать свою, с поддержкой той самой OPC
6. okulus 10.06.14 09:31 Сейчас в теме
Есть пример работы с OPC сервером Siemens через COM из Excel:
How do you create an OPC client with Microsoft Excel

Скажите как объявить переменные с типом 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)
Показать
12. okulus 03.07.14 07:59 Сейчас в теме
На http://www.opcconnect.com/delphi.php#client
есть пример с OPC-клиента на Delphi. Он у меня работает.

Ещё есть пример для Excel - http://support.automation.siemens.com/WW/view/en/24299099

Ошибка, как я понял, в инициализации 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);
3. okulus 23.05.14 23:14 Сейчас в теме
Насколько я понял, достаточно сконфигурировать обычный компьютер как OPC-сервер

и можно получить необходимые фактические данные из производства (без SCADA).

Так как OPC DA/HDA являются COM-объектами (Siemens OPC DA Automation 2.0), то можно без проблем обратится к ним из 1С.
Вот пример реализации: http://1c-opc.ru/.

Но как обратится к OPC UA из 1С?
4. okulus 23.05.14 23:32 Сейчас в теме
Ешё было бы неплохо, если бы 1С:MES взял на себя функцию data acquisition из SCADA для построения трендов
5. nickpugachev 25.05.14 13:47 Сейчас в теме
Вот к UA обращаться совсем не проблема, ибо web-services. В крайнем случае делается COM-обертка над их .Net компонентами.

А общаться напрямую через OPC-сервер имеет смысл только если у нас в производстве эти датчики занимаются только отдачей информации и не больше. Как только у нас контроллеры начинают двигать задвижки, изменять напряжений и т.п. - 1с должна отползти в сторону и дергать только скаду.

MES не будет брать на себя куски скады - не для того делалось :), он и MES-функционал не закрывает полностью. На сейчас это просто заготовка для дальнейшего запила при внедрении - вот на этом этапе и имеет смысл делать для него свои модули.
7. nickpugachev 10.06.14 12:48 Сейчас в теме
Variant - это любой тип, в 1с и так все переменные этого типа
Long - длинное целое число, скорее всего 32-битное, судя по VB, при передаче числовой переменной через COM интерфейсы 1с сама его к Long попытается преобразовать, если интерфейс этого требует.
8. okulus 11.06.14 11:11 Сейчас в теме
Интересно, а как реализовать из 1С подключение к OPC UA серверу Siemens:
9. nickpugachev 11.06.14 14:58 Сейчас в теме
если через opc.tcp - надо или делать или искать на просторах COM-обертку над .Net компонентами
если через opc.http - это веб-сервисы
Hexed; okulus; +2 Ответить
10. okulus 03.07.14 07:03 Сейчас в теме
а opc.http требует поднятия IIS?
11. okulus 03.07.14 07:46 Сейчас в теме
	opc = Новый COMОбъект("OPC.SiemensDAAuto.1");
	
	opc.connect("OPC.SimaticNET");
	opcGroups = opc.OPCGroups;
	opcGroups.DefaultGroupUpdateRate = 2000; 
	opcGroups.DefaultGroupIsActive = True; 	
	opcGroup1 = opcGroups.Add("Group1");
	opcGroup1.IsActive = True; 
	opcGroup1.UpdateRate = 200; 
	opcGroup1.IsSubscribed = True;

	opcItem1 = opcGroup1.OPCItems.AddItem("S7:[S7_Connection_1]DB1,X0.0", 1);
	                                       
	OPC_DS_CACHE = 1;
	NumItems = 1;
	ServerHandles = opcItem1.ServerHandle;
	Values = Новый ComSafeArray("VT_I4", 2);	
	Errors = Новый ComSafeArray("VT_I4", 2);
	Qual = "";
	TS = "";
	TransactionID = 1979;
	CancelID = 1;
	opcGroup1.SyncRead(OPC_DS_CACHE, 1, ServerHandles, Values, Errors, Qual, TS);
Показать


{Обработка.opc.Форма.Форма.Форма(47)}: Ошибка при вызове метода контекста (SyncRead)
opcGroup1.SyncRead(OPC_DS_CACHE, 1, ServerHandles, Values, Errors, Qual, TS);
по причине:
Типы не совпадают (4)
Типы не совпадают (4)
13. okulus 03.07.14 09:26 Сейчас в теме
Поменял на
Values = Новый ComSafeArray("VT_VARIANT", 2);

Ошибки нет, но Values пустой после вызова приходит
14. nickpugachev 03.07.14 14:00 Сейчас в теме
как вариант - воспользоваться первым вариантом, только после создания еще и инициализировать элементы (0 в них записать)
15. okulus 04.07.14 08:36 Сейчас в теме
16. a-novoselov 1156 04.07.14 12:30 Сейчас в теме
Насколько я понимаю, то тут так должно быть:
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 указан.
17. okulus 04.07.14 14:02 Сейчас в теме
сейчас подгружу новый скринкаст
18. okulus 04.07.14 14:07 Сейчас в теме
иногда почему-то FullHD видео на youtube загружается в максимальном разрешении 320 (((
23. sp1406 1 01.03.20 14:24 Сейчас в теме
(19) В итоге удалось решить задачу?
20. okulus 03.10.14 08:28 Сейчас в теме
Подскажите, каким документом ложиться готовая продукция на склад?
21. Hexed 2 08.01.15 15:35 Сейчас в теме
Парни, что может быть. При отработке кода

	opc = Новый COMОбъект("OPC.Automation.1");
	opc.connect("OWEN.MODBUS");
	opcGroup1 = opc.OPCGroups.Add("Group1");


Получаю: Метод объекта не обнаружен (Add) opcGroup1 = opcGroups.Add("Group1");
22. Hexed 2 09.01.15 11:41 Сейчас в теме
Решено. Стояла старая версия OPCDAAuto.dll
24. pechen18 02.03.23 11:07 Сейчас в теме
добрый день.
Необходимо получить данные с OPC DA. Делаю Com-соединение. Добавляю группу и параметры, которые необходимо получить. Но возникают проблемы с определением типов аргументов для метода SyncRead. Может кто помочь как определить тип данных Long и Variant?
Может вообще что то делаю не так?
        ОРСServer = ПолучитьОРССоединение("OPC.Automation",СтрокаПодключения,Комп, мОшибка);

        OPCGroups=ОРСServer.OPCGroups;
	OPCGroup =OPCGroups.Add("OPCUA1");
	OPCItems =OPCGroup.OPCItems;
	OPCGroup.IsActive = True;
	Item = OPCItems.AddItem("OPCUA2.LASKA500_1.TEMP_SCADA_2",1);

        OPC_DS_CACHE = 1;
	NumItems = 1;
	ServerHandles = Item.ServerHandle;   
	Values = Новый ComSafeArray(, "VT_VARIANT");
	Errors = Новый ComSafeArray(, "VT_I4");      
	Qualities = "";
	TimeStamps = "";
	
	OPCGroup.SyncRead(OPC_DS_CACHE, NumItems, ServerHandles, Values, Errors, Qualities, TimeStamps);
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот