Excel VBA в VB (DCOM)

Я унаследовал электронную таблицу Excel VBA. Мне было поручено преобразовать его в VB.

Я думаю, что приложение получает данные от ПЛК с помощью объекта DCOM. Следующий код запускает подпрограмму SBR1Select при обновлении MX1.0.

Sub Workbook_Open()
    ActiveWorkbook.SetLinkOnData "dassidirect|strandburner!MX1.0", "SBR1Select"
End Sub

Когда я открываю Панель управления -> Администрирование -> Службы компонентов, а затем перехожу к корневой консоли -> Службы компонентов -> Компьютеры -> Мой компьютер -> Конфигурация DCOM, в списке отображается элемент «DASSIDirect», на который, как я полагаю, ссылается Excel. .

Как подключить код VB к ПЛК через компонент DASSIDIRECT?

ПРИМЕЧАНИЕ. DASSIDIRECT также является службой Windows (не уверен, поможет ли это ответить на вопрос).


person Community    schedule 27.04.2009    source источник
comment
Они отвечают на ваш вопрос? В противном случае вы можете отредактировать и обновить свой вопрос?   -  person Christian Payne    schedule 01.06.2009


Ответы (3)


Некоторое время назад я немного поработал с ПЛК и спросил об этом одного из своих старых коллег. Он говорит, что вам нужен InTouch от WonderWare, у которого есть набор совместимых с .Net 2 сборок, которые будут работать с DASSIDIRECT, чтобы дать вам то, что вам нужно.

Вот последняя версия, и я надеюсь, что это то, что вы ищете.

person miPwn    schedule 29.04.2009

Ого, ДДЭ. DDE, как я уверен, вы знаете, довольно старый. Сетевой DDE уже устарел и больше не будет работать в Vista. Я могу только предположить, что эта тенденция, вероятно, сохранится. Однако API DDE в user32 по-прежнему работает (ссылка здесь: http://msdn.microsoft.com/en-us/library/ms674605(VS.85).aspx), и вы можете вызвать это из приложений .net, немного поработав. Единственные примеры, которые я смог найти, были для VB6, и они уже тогда были старыми. Как я уверен, вы можете представить, что это немного болезненно. Во всяком случае, я выкопал этот пример из API-Guide (от Mentalis). Это не .Net, но в любом случае вы должны начать:

'This application shows you how to use DDE to create a better PrevInstance-function.
'Compile this sample and start it two times
'The first instance minimizes itself and when the second instance is started, it will
'send a message to the first instance to maximize itself.

'in a module
Public Const VBServerName = "TestServer"
Public Const VBTopicName = "SHOW_YOUR_MAIN_WINDOW"
Public Const XCLASS_BOOL = &H1000
Public Const XTYPF_NOBLOCK = &H2 ' CBR_BLOCK will not work
Public Const XTYP_CONNECT = &H60 Or XCLASS_BOOL Or XTYPF_NOBLOCK
Public Const CP_WINANSI = 1004 ' default codepage for windows & old DDE convs.
Public Const SW_RESTORE = 9
Public Const DDE_FACK = &H8000
Public Const XCLASS_FLAGS = &H4000
Public Const XTYP_EXECUTE = &H50 Or XCLASS_FLAGS
Public Const DNS_REGISTER = &H1
Public Const DNS_UNREGISTER = &H2
Public Declare Function DdeInitialize Lib "user32" Alias "DdeInitializeA" (pidInst As Long, ByVal pfnCallback As Long, ByVal afCmd As Long, ByVal ulRes As Long) As Integer
Public Declare Function DdeCreateStringHandle Lib "user32" Alias "DdeCreateStringHandleA" (ByVal idInst As Long, ByVal psz As String, ByVal iCodePage As Long) As Long
Public Declare Function DdeConnect Lib "user32" (ByVal idInst As Long, ByVal hszService As Long, ByVal hszTopic As Long, pCC As Any) As Long
Public Declare Function DdeNameService Lib "user32" (ByVal idInst As Long, ByVal hsz1 As Long, ByVal hsz2 As Long, ByVal afCmd As Long) As Long
Public Declare Function DdeFreeStringHandle Lib "user32" (ByVal idInst As Long, ByVal hsz As Long) As Long
Public Declare Function DdeQueryString Lib "user32" Alias "DdeQueryStringA" (ByVal idInst As Long, ByVal hsz As Long, ByVal psz As String, ByVal cchMax As Long, ByVal iCodePage As Long) As Long
Public Declare Function DdeUninitialize Lib "user32" (ByVal idInst As Long) As Long
Function DdeCllback(ByVal uType As Long, ByVal uFmt As Long, ByVal hConv As Long, ByVal hszTopic As Long, ByVal hszItem As Long, ByVal hData As Long, ByVal dwData1 As Long, ByVal dwData2 As Long) As Long
    DdeCllback = Form1.AppDdeCallback(uType, uFmt, hConv, hszTopic, hszItem, hData, dwData1, dwData2)
End Function
'in a form
Dim isRun As Boolean, idInst As Long, hszVBServer As Long, hszVBTopic As Long
Dim hconvVBServer As Long, dderesult As Long
Private Sub Form_Load()
   'KPD-Team 2000
   'URL: http://www.allapi.net/
   'E-Mail: [email protected]
   If DdeInitialize(idInst, AddressOf DdeCllback, 0, 0) Then Exit Sub
   hszVBServer = DdeCreateStringHandle(idInst, VBServerName, CP_WINANSI)
    hszVBTopic = DdeCreateStringHandle(idInst, VBTopicName, CP_WINANSI)
    'try to find the first instance
    hconvVBServer = DdeConnect(idInst, hszVBServer, hszVBTopic, ByVal 0&)
    If hconvVBServer Then
        Unload Me
        Exit Sub
    End If
    DdeNameService idInst, hszVBServer, 0, DNS_REGISTER
    Me.WindowState = vbMinimized
End Sub
Private Sub Form_Unload(Cancel As Integer)
        DdeFreeStringHandle idInst, hszVBServer
        DdeFreeStringHandle idInst, hszVBTopic
        'only unregister the DDE server for first instance
        If isRun Then
            If DdeNameService(idInst, hszVBServer, 0, DNS_UNREGISTER) Then
                MsgBox "in ServiceUnRegister", vbOKOnly, "Error"
            End If
        End If
        DdeUninitialize idInst
End Sub
Function AppDdeCallback(ByVal wType As Long, ByVal wFmt As Long, ByVal hConv As Long, ByVal hszTopic As Long, ByVal hszItem As Long, ByVal hData As Long, ByVal lData1 As Long, ByVal lData2 As Long) As Long
        Dim iCount As Long, Buffers As String, Ret As Long
        Select Case wType
            Case XTYP_CONNECT
                iCount = DdeQueryString(idInst, hszTopic, vbNullString, 0, CP_WINANSI)
                Buffers = Space(iCount)
                DdeQueryString idInst, hszTopic, Buffers, iCount + 1, CP_WINANSI
                If Buffers = VBTopicName Then
                    Me.WindowState = vbNormal
                    'add any code for the first instance have found the second one is launch
                    Ret = DDE_FACK
                End If
                AppDdeCallback = Ret
            Case XTYP_EXECUTE
                AppDdeCallback = Ret
        End Select
End Function
person Oorang    schedule 17.05.2009

Самый простой способ справиться с этим — использовать VB 6 и создать «ActiveX EXE», который связывает DDE с SIDirect. Выполнение DDE из VB 6 тривиально. Затем создайте первичную сборку взаимодействия для модуля VB 6 с помощью tlbimp или просто укажите EXE-файл как COM-компонент из кода C#.

person zumalifeguard    schedule 15.10.2009