OPC client VB6 перевести в C# .NET

Язык C#: программирование на C#, портирование кода C# на VB и VB на C#.

Модератор: Ramzes

Al Prad
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 16.08.2007 (Чт) 12:46
Откуда: Одесса

OPC client VB6 перевести в C# .NET

Сообщение Al Prad » 17.02.2009 (Вт) 13:51

Добрый день!
Небольшая программка считывает таг из OPC сервера. Имеет референс на OPCDAauto.dll.
Помогите, плиз, перегнать на C#.
Пробовал программку-конвертер VBto - генерирует кучу ошибок.
Собственно, код:
Код: Выделить всё
Option Explicit  ' every variable has to be declared
Option Base 1    ' every Array starts on Index 1

Private MyOPCServer As OPCServer
Private WithEvents MyOPCGroup As OPCGroup
Private MyOPCItems() As OPCItem


Private Sub btnConnect_Click()
  Dim i As Integer

    Set MyOPCServer = New OPCServer
   
    'connect the OPC Server
    Call MyOPCServer.Connect(txtOPCServerName.Text)
   
    'add one OPC Group
    Set MyOPCGroup = MyOPCServer.OPCGroups.Add("Gruppe1")
   
    'apply for DataChange
    MyOPCGroup.IsSubscribed = True
    MyOPCGroup.UpdateRate = 500
   
    'add Items
   
    ReDim MyOPCItems(1) 'kolichestvo tagov
   
    Set MyOPCItems(1) = MyOPCGroup.OPCItems.AddItem(txtTagName1.Text, 1)
   

End Sub


Private Sub btnDisconnect_Click()
    'disconnect the OPC Server
    Call MyOPCServer.Disconnect
    Set MyOPCServer = Nothing
   

End Sub

Private Sub btnRead_Click()
   ' Dim SHandles(2) As Long 'parameter value
   Dim SHandles(1) 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

       
   
        Call MyOPCGroup.SyncRead(OPCCache, 1, SHandles, Values, Errors, Qual, TS)
       
   'fill   with the read values

 
    txtValue = Values(1)   'column "read"
    txtQuality = Qual(1)     'column "quality"
    txtTimeStamp = TS(1)        'column "timestamp"
 
   
   
End Sub

Private Sub btnWrite_Click()

    Dim SHandles(1) As Long  'parameter value
    Dim Values(1) As Variant 'parameter value
    Dim Errors() As Long     'return value
    Dim i As Integer

       
    'save ServerHandles
    SHandles(1) = MyOPCItems(1).ServerHandle

   
    'find out the values which are written into the following cells (line 11+12, column F)
    'this values should be writen into PLC

    Values(1) = Val(txtWrite.Text)
 
   Call MyOPCGroup.SyncWrite(1, SHandles, Values, Errors)
End Sub

Private Sub MyOPCGroup_DataChange(ByVal TransactionID As Long, _
                                    ByVal NumItems As Long, _
                                    ClientHandles() As Long, _
                                    ItemValues() As Variant, _
                                    Qualities() As Long, _
                                    TimeStamps() As Date)
   
    Dim i As Integer

 
  txtValue.Text = ItemValues(1)
   
End Sub


Спасибо.

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Re: OPC client VB6 перевести в C# .NET

Сообщение Ramzes » 18.02.2009 (Ср) 10:43

Подключаешь Reference и поехали

C#
//Option Explicit ' every variable has to be declared
//Option Base 1 ' every Array starts on Index 1

//Private MyOPCServer As OPCServer

OPCServer MyOPCServer;

//Private WithEvents MyOPCGroup As OPCGroup
OPCGroup MyOPCGroup;
//Не забуть руками добавить обработчик события, приблизительно так:
//MyOPCGroup.DataChange += new EventHandler(MyOPCGroup_DataChange);


//Private MyOPCItems() As OPCItem
OPCItem[] MyOPCItems;


//Private Sub btnConnect_Click()
private void btnConnect_Click(object sender, EventArgs e)
{
//Dim i As Integer
int t;

//Set MyOPCServer = New OPCServer
MyOPCServer = new OPCServer();

//'connect the OPC Server
//Call MyOPCServer.Connect(txtOPCServerName.Text)
MyOPCServer.Connect(txtOPCServerName.Text);
//'add one OPC Group
//Set MyOPCGroup = MyOPCServer.OPCGroups.Add("Gruppe1")
MyOPCGroup = MyOPCServer.OPCGroups.Add("Gruppe1");
//'apply for DataChange
//MyOPCGroup.IsSubscribed = True
MyOPCGroup.IsSubscribed = true;
//MyOPCGroup.UpdateRate = 500
MyOPCGroup.UpdateRate = 500;

//'add Items

//ReDim MyOPCItems(1) 'kolichestvo tagov
MyOPCItems = new MyOPCItems[1];
//Set MyOPCItems(1) = MyOPCGroup.OPCItems.AddItem(txtTagName1.Text, 1)
//в .net нумерация массива начинается с 0

MyOPCItems[0] = MyOPCGroup.OPCItems.AddItem(txtTagName1.Text, 1);
//End Sub
}


//Private Sub btnDisconnect_Click()
private void btnDisconnect_Click(object sender, EventArgs e)
{
//'disconnect the OPC Server
//Call MyOPCServer.Disconnect

MyOPCServer.Disconnect();
//Set MyOPCServer = Nothing
MyOPCServer = null;
//End Sub
}

//Private Sub btnRead_Click()
private void btnRead_Click(object sender, EventArgs e)
{
//' Dim SHandles(2) As Long 'parameter value
//Dim SHandles(1) As Long 'parameter value

int[1] SHandles;
//Dim Values() As Variant 'return value
object[] Values;
//Dim Errors() As Long 'return value
int[] Errors;
//Dim Qual As Variant 'return value
object Qual;
//Dim TS As Variant 'return value
object TS;
//Dim i As Integer
int i;

'save ServerHandles
//SHandles(1) = MyOPCItems(1).ServerHandle
SHandles[0] = MyOPCItems(0).ServerHandle;
//Call MyOPCGroup.SyncRead(OPCCache, 1, SHandles, Values, Errors, Qual, TS)
//ТУТ НАВЕРНЯКА НЕКОРОРЫЕ ПАРАМЕТРЫ НАДО ПЕРЕДАВАТЬ ПО ССЫЛКЕ, ТАК, ЧТО ПРОВЕРЯЙ СИГНАТУРУ!
MyOPCGroup.SyncRead(OPCCache, 1, ref SHandles, Values, ref Errors, Qual, TS);
//'fill with the read values

//txtValue = Values(0) 'column "read"

txtValue.Text = Values[1].ToString();
//txtQuality = Qual(0) 'column "quality"
txtQuality.Text = Qual[0].ToString
//txtTimeStamp = TS(1) 'column "timestamp"
txtTimeStamp.Text = TS[1].ToString();

//End Sub
}

//Private Sub btnWrite_Click()
private void btnWrite_Click(object sender, EventArgs e)
{
//Dim SHandles(1) As Long 'parameter value
int[1] SHandles;
//Dim Values(1) As Variant 'parameter value
object[1] Values;
//Dim Errors() As Long 'return value
int[] Errors;
//Dim i As Integer
int i;

//'save ServerHandles
//SHandles(1) = MyOPCItems(1).ServerHandle
SHandles[0] = MyOPCItems[0].ServerHandle;
//'find out the values which are written into the following cells (line 11+12, column F)
//'this values should be writen into PLC

//Values(1) = Val(txtWrite.Text)
Values[0] = txtWrite.Text;
//Call MyOPCGroup.SyncWrite(1, SHandles, Values, Errors)
MyOPCGroup.SyncWrite(1, SHandles, Values, Errors);
//End Sub
}

/*Private Sub MyOPCGroup_DataChange(ByVal TransactionID As Long, _
ByVal NumItems As Long, _
ClientHandles() As Long, _
ItemValues() As Variant, _
Qualities() As Long, _
TimeStamps() As Date)
*/

private void MyOPCGroup_DataChange(int TransactionID,
int NumItems,
int[] ClientHandles,
object[] ItemValues,
int[] Qualities,
DateTime[] TimeStamps)
{
//Dim i As Integer
int i;
//txtValue.Text = ItemValues(1)
txtValue.Text = ItemValues[0].ToString();

//End Sub
}

Al Prad
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 16.08.2007 (Чт) 12:46
Откуда: Одесса

Re: OPC client VB6 перевести в C# .NET

Сообщение Al Prad » 18.02.2009 (Ср) 11:58

Добрый день!


Референс добавил.
Пробую:

OPCServer MyOPCServer;

Error 8 The type or namespace name 'OPCServer' could not be found (are you missing a using directive or an assembly reference?)


OPCGroup MyOPCGroup;

Error 9 The type or namespace name 'OPCGroup' could not be found (are you missing a using directive or an assembly reference?)


OPCItem[] MyOPCItems;

Error 10 The type or namespace name 'OPCItem' could not be found (are you missing a using directive or an assembly reference?)



int[1] SHandles;

Error 1 Invalid expression term 'int'


object[1] Values;
Error 3 Invalid expression term 'object'



Вот нашел в сети 2 примера на VB NET. Оба работают. Может, они помогут правильно сконвертить?
У вас нет доступа для просмотра вложений в этом сообщении.

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Re: OPC client VB6 перевести в C# .NET

Сообщение Ramzes » 18.02.2009 (Ср) 12:02

я, знаете ли, не конвертил, а руками писал.
и что мешает прописать неймспейсы? Студия во-первых сама может предложить, если навести указатель мыши на обьявление переменной, а во-вторых, есть же Object Browser.

ну и наконец, если есть примеры на VB.Net, что мешает перевести их самому на С# :?:

Просто у меня нет времени (и честно сказать, желания) делать все это за Вас. Да и Вам это будет полезно, а вот подсказать какой-то непонятный момент, это всегда пожалуйста :)

Al Prad
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 16.08.2007 (Чт) 12:46
Откуда: Одесса

Re: OPC client VB6 перевести в C# .NET

Сообщение Al Prad » 18.02.2009 (Ср) 12:39

Я имел в виду сконвертить - переписать с VB на С, а уж программой или руками - мне без разницы. Прошу прощения, если невольно обидел.

Да знаний и опыта у меня не хватает, вот и попросил помощи.

Образно говоря, хочу быстро построить дом из готовых блоков, а приходится заниматься обработкой кирпичиков. А стройка тем временем стоит :)

Поверьте, весьма непросто человеку, который использует VS очень периодически для решения каких-то своих задач, догадаться, что надо добавить
//MyOPCGroup.DataChange += new EventHandler(MyOPCGroup_DataChange);
Там, где гуру все понятно , там для любителя-темный лес.

Если бы где -нибудь был словарь VB-C#, наподобие русско-английского, я бы заглядывал туда; а так - вынужден приставать к носителям знаний...

Чесно говоря, я почти не расчитывал, что кто-то возьмется за такой приличный кусок кода.
Так что спасибо Вам за участие.
Последний раз редактировалось Al Prad 18.02.2009 (Ср) 13:04, всего редактировалось 1 раз.

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Re: OPC client VB6 перевести в C# .NET

Сообщение Ramzes » 18.02.2009 (Ср) 13:00

Al Prad писал(а):Я имел в виду сконвертить - переписать с VB на С, а уж программой или руками - мне без разницы. Прошу прощения, если невольно обидел.

Не переживай ;)

Al Prad писал(а):Да знаний и опыта у меня не хватает, вот и попросил помощи. Поверьте, весьма непросто человеку, который использует VS очень периодически для решения каких-то своих задач, догадаться, что надо добавить
//MyOPCGroup.DataChange += new EventHandler(MyOPCGroup_DataChange);
Там, где гуру все понятно , там для любителя-темный лес.

Согласен, момент событий в C# и VB.Net с точки зрения пользователя (программиста) существенно отличается.
если в Visual Basic .Net ты пишешь
Код: Выделить всё
Dim myC as MyClass = new MyClass;

Private sub MyClass_MyEvent() Handles myC.MyEvent
End Sub


То в С# тебе надо явно добавить обработчик события
Код: Выделить всё
MyClass myC = new MyClass();
myC.MyEvent += MyEventHandler(MyClass_MyEvent)//Вместо разработчика visual basic эту строку создаст студия
private void MyClass_MyEvent(){}


Но это стандартная работа с событиями, и не зная .net ...
Al Prad писал(а):Если бы где -нибудь был словарь VB-C#, наподобие русско-английского, я бы заглядывал туда; а так - вынужден приставать к носителям знаний...

в MSDN точно есть, можешь поискать
Al Prad писал(а):Чесно говоря, я почти не расчитывал, что кто-то возьмется за такой приличный кусок кода.
Так что спасибо Вам за участие.

U Wellcome :)

Al Prad
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 16.08.2007 (Чт) 12:46
Откуда: Одесса

Re: OPC client VB6 перевести в C# .NET

Сообщение Al Prad » 18.02.2009 (Ср) 15:29

Понемногу продвигаюсь.

Добавляю обработчик
MyOPCGroup.DataChange += new OPCAutomation.DIOPCGroupEvent_DataChangeEventHandler (MyOPCGroup_DataChange);

пишет Error 1 Invalid token '+=' in class, struct, or interface member declaration

Уже вариантов 15 попробовал. Не знаю, что этой студии от меня нужно. Уже фантазия иссякла.


Вернуться в C#

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

    TopList