2009-04-27 4 views
4

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

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

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

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

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

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

+0

Эти ответы на ваш вопрос? В противном случае вы можете отредактировать и обновить свой вопрос? –

ответ

1

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

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

0

Ничего себе, DDE. DDE, поскольку я уверен, что вы знаете, довольно старый. Сетевой DDE уже обесценился и больше не будет работать в Vista. Я могу только представить, что тенденция, вероятно, продолжится. Однако API DDE в user32 все еще работает (ссылка здесь: http://msdn.microsoft.com/en-us/library/ms674605(VS.85).aspx), и вы можете вызвать это из приложений .net с небольшой работой. Единственные примеры, которые я мог найти, были для VB6, и они были старыми даже тогда. Как я уверен, вы можете себе представить, что это немного больно. Во всяком случае, я выкопал этот пример из API-руководства (от 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 
0

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