Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> код VB6 работает а на C# не совсем точно, передача 32 bit 
:(
    Опции темы
PashaSem
Дата 9.12.2006, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 5.3.2006

Репутация: нет
Всего: нет



В чем отличие кода на VB  и на C#
Код

Private Sub btn_Write32BitInteger_Click()

    Dim lReturnCode As Long                         'Return code
    Dim buffer32BitInteger  As udt32BitInteger      'User-defined type for '32bit Integer' data
    Dim bufferInteger As udtInteger                 'User-defined type for writing to the PLC
Const ELEMENT_SIZE_32BITINTEGER = 2 'Size of elements, when reading/writing '32bit Integer' data to 
    
    'Error Handler
    On Error GoTo CatchError
    
    'Copy the TextBox data to the user-defined type for '32bit Integer'.
    buffer32BitInteger.l32BitInteger = CLng(txt_Write32BitInteger.Text)
    
    'Copy the 'buffer32BitInteger' to the user-defined type for writing to the PLC.
    LSet bufferInteger = buffer32BitInteger
    
    'The WriteDeviceBlock2 method is executed.(to D10-D11)
    lReturnCode = ActEasyIF1.WriteDeviceBlock2("D231", _
                                                ELEMENT_SIZE_32BITINTEGER, _
                                                bufferInteger.iarrInteger(0))
    
    'When ActEasyIF returns error code, display error message.
    If lReturnCode <> 0 Then
        DisplayErrorMessage (lReturnCode)
        Exit Sub
    End If

    Exit Sub

CatchError:  'Exception processing
    
    szErrMsg = Error$(Err)
    MsgBox szErrMsg, vbCritical
    End

End Sub



и код которы йдолж выполнять то же но на c# 

Код

static void Method_Steps(ref int Steps_Send)
        {
            Steps_Send = 272525;
        }
  axActEasyIF1.ActLogicalStationNumber = 1;
            lRet = axActEasyIF1.Open();
          int lSize = 2;          //ReadSize
           int[] lData = new int [lSize]; //DeviceData
            Method_Steps(ref lData[0]);
            lRet = axActEasyIF1.WriteDeviceBlock("D231", lSize, ref lData[0]);  
            lRet = axActEasyIF1.Close();

Происходит то что код на VB6 отсылает девайсу 32bit  int и девайс воспринимает  его как 32 bit
а код на c# отсылает то же 32 bit но воспринимаються тоько 16 первых.

Одинаковы ли два кода по выполнению одной задачи ?

Спасибо!
PM MAIL   Вверх
mr.DUDA
Дата 9.12.2006, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Код
 int lSize = 2;

заменить на
Код
 int lSize = 4;


Размер int-переменной 4 байта. Если 2 - будут восприниматься первые 16 бит.


--------------------
user posted image
PM MAIL WWW   Вверх
PashaSem
Дата 9.12.2006, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 5.3.2006

Репутация: нет
Всего: нет



Нашел релизацию для VB.net 

Код

 Const ELEMENT_SIZE_32BITINTEGER = 2 
Private Sub btn_Write32bitInteger_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Write32bitInteger.Click

        Dim iReturnCode As Integer                                              'Return code
        Dim byarrBufferByte() As Byte                                           'Array for using BitConverter class
        Dim sharrBufferForDeviceValue(ELEMENT_SIZE_32BITINTEGER - 1) As Short   'Array for writing to the PLC

        'Error Handler
        On Error GoTo CatchError

        'Convert the TextBox data into the 'byarrBufferByte' as 32bit integer.(Array size:4 bytes)
        byarrBufferByte = BitConverter.GetBytes(CInt(txt_Write32bitInteger.Text))

        'Convert the 'byarrBufferByte' to the array for writing to the PLC.
        sharrBufferForDeviceValue(0) = BitConverter.ToInt16(byarrBufferByte, 0)
        sharrBufferForDeviceValue(1) = BitConverter.ToInt16(byarrBufferByte, 2)

        'The WriteDeviceBlock2 method is executed.(to D10-D11)
        iReturnCode = AxActEasyIF1.WriteDeviceBlock2("D10", _
                                                     ELEMENT_SIZE_32BITINTEGER, _
                                                     sharrBufferForDeviceValue(0))

        'When ActEasyIF returns error code, display error message.
        If iReturnCode <> 0 Then
            DisplayErrorMessage(iReturnCode)
            Exit Sub
        End If

        Exit Sub


Теперь буду сооброжать как то же на C#  написать!
Спасибо!
PM MAIL   Вверх
mr.DUDA
Дата 9.12.2006, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Самый быстрый способ: скомпилировать VB-код и дизассемблировать его reflector-ом в C#-код.  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
PashaSem
Дата 10.12.2006, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 5.3.2006

Репутация: нет
Всего: нет



В последнем примере!
Код

 'Convert the 'byarrBufferByte' to the array for writing to the PLC.
        sharrBufferForDeviceValue(0) = BitConverter.ToInt16(byarrBufferByte, 0)
        sharrBufferForDeviceValue(1) = BitConverter.ToInt16(byarrBufferByte, 2)

        'The WriteDeviceBlock2 method is executed.(to D10-D11)
        iReturnCode = AxActEasyIF1.WriteDeviceBlock2("D10", _
                                                     ELEMENT_SIZE_32BITINTEGER, _
                                                     sharrBufferForDeviceValue(0))

sharrBufferForDeviceValue(0)) ссылочный тип который указывает на первый элемент масива.
как организовать ссылку в c# 
Код

 byte[] byarrBufferByt = new byte[4]; //'Array for using BitConverter class
            short[] sharrBufferForDeviceValue = new short[1];   //Array for writing to the PLC

            int Send_value = Convert.ToInt32(textBox8.Text);
            //Convert the TextBox data into the 'byarrBufferByte' as 32bit integer
            byarrBufferByt = BitConverter.GetBytes(Send_value);
            sharrBufferForDeviceValue[0] = BitConverter.ToInt16(byarrBufferByt, 0);
            sharrBufferForDeviceValue[1] = BitConverter.ToInt16(byarrBufferByt, 2);

lRet = axActEasyIF1.WriteDeviceBlock2( "D400",2, ref  ????????);

Как организоать ссылку на sharrBufferForDeviceValue[0] ?
Спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0862 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.