реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Опрос com порта, как?
FxMODE
сообщение Nov 13 2008, 05:38
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 12-11-08
Пользователь №: 41 553



Приветствую.
Нужно сделать запрос к СКС-3 по протоколу M-Bus. Опыта работы с протоколами не было, да и примеров найти не могу. Есть стандартный мануал, эт конечно хорошо. Но нужен любой пример запроса, просто покажите как это делать.
Заранее спасибо
Go to the top of the page
 
+Quote Post
birden
сообщение Nov 13 2008, 09:44
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 28-10-06
Из: Новосибирск
Пользователь №: 21 743



M-Bus это Modbus?
Если да, то нужно смотреть в "снандартном мануале" описание ргистров/входов/выходов этого самого СКС-3, и сделать соответсвующий запрос. Здесь на форуме формат запроса по Modbus где-то был показан, если не ошибаюсь.
Go to the top of the page
 
+Quote Post
FxMODE
сообщение Feb 10 2009, 11:45
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 12-11-08
Пользователь №: 41 553



Привет! Есть два компа, соединены нуль модемным кабелем через компорт. С одного посылаются символы с Тератерма. Как с помощью Си реализовать ловлю этих символов на другом компе? Заранее спасибо
Go to the top of the page
 
+Quote Post
Tcom
сообщение Feb 10 2009, 21:05
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 360
Регистрация: 3-01-06
Из: Украина Запорожская обл.
Пользователь №: 12 792



Познать хотя бы C++Builder или Visual Studio
Go to the top of the page
 
+Quote Post
clpe
сообщение Feb 11 2009, 21:05
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 71
Регистрация: 23-10-08
Из: Набережные Челны
Пользователь №: 41 132



Цитата(FxMODE @ Nov 13 2008, 08:38) *
Приветствую.
Нужно сделать запрос к СКС-3 по протоколу M-Bus. Опыта работы с протоколами не было, да и примеров найти не могу. Есть стандартный мануал, эт конечно хорошо. Но нужен любой пример запроса, просто покажите как это делать.
Заранее спасибо


Пример modbus, по крайней мере у нас реализован был так:
CODE
uchar ReadRegs(uchar RegAddr, uint* Data, uchar WaitTime)
{
    uchar LRC;
    uchar SlaveAddr;
    uint RegCount;
    uchar OutCount;
    uchar ErrCount=0;
Repeat:
    SlaveAddr = 2;
    RegCount = 1;
    OutCount = 0;
    FrameBuffer[0]=':';
    /* поле адреса ведомого */
    FrameBuffer[1]=NumToChar(SlaveAddr>>4);
    FrameBuffer[2]=NumToChar(SlaveAddr&0x0F);
    /* поле финкции */
    FrameBuffer[3]=NumToChar(READ_REGS>>4);
    FrameBuffer[4]=NumToChar(READ_REGS&0x0F);
    /* поле адреса регистра */
    FrameBuffer[7]=NumToChar((RegAddr&0x00F0)>>4);
    FrameBuffer[8]=NumToChar(RegAddr&0x0F);
    RegAddr>>=8;
    FrameBuffer[5]=NumToChar((RegAddr&0x00F0)>>4);
    FrameBuffer[6]=NumToChar(RegAddr&0x0F);
    /* количество регистров */
    FrameBuffer[11]=NumToChar((RegCount&0x00F0)>>4);
    FrameBuffer[12]=NumToChar(RegCount&0x0F);
    RegCount>>=8;
    FrameBuffer[9]=NumToChar((RegCount&0x00F0)>>4);
    FrameBuffer[10]=NumToChar(RegCount&0x0F);
    /* контрольная сумма LRC */
    LRC = Calc_LRC((uchar*)&FrameBuffer[1], 12);
    FrameBuffer[13]=NumToChar((LRC&0xF0)>>4);
    FrameBuffer[14]=NumToChar(LRC&0x0F);
    /* признак конца пакета */
    FrameBuffer[15]='\r';
    FrameBuffer[16]='\n';
    FrameBuffer[17]='\0';
    // отправляем готовый пакет  
    do
    {
        while(UCSRA_UDRE == false);
        UDR = FrameBuffer[OutCount++];
    }
    while(FrameBuffer[OutCount] != '\0');
    // ждём ответа
    SetTimeOut(WaitTime);
    PackedReady = false;
    FrameLen = 0;
    while(PackedReady==false && TimeOut>0);
    if(TimeOut == 0)
    {
        if( ++ErrCount == 4 )
        {
            return TIME_OUT_ERR;
        }
        else goto Repeat;
    }
    RemoveTimeOut();
    FrameLen -= 4;
    LRC = CharToNum(FrameBuffer[FrameLen]);             // декодируем LRC    ASCII -> число        
    LRC <<= 4;
    LRC |= CharToNum(FrameBuffer[FrameLen+1]);
    if(LRC == Calc_LRC((uchar*)&FrameBuffer[1], FrameLen-1))     // проверяем LRC
    {
        // забираем содержимое регистра
        *Data = StrToInt((uchar*)&FrameBuffer[RESPOND_FIELD_DATA], WORD);
        return NORMAL;
    }    
    else
    {
        if( ++ErrCount == 4 )
        {
            return CRC_ERR;
        }
        else goto Repeat;
    }
}

//--------------------------------------------------------------------------------

uchar WriteRegs(uchar RegAddr, uint Data, uchar WaitTime)
{
    uchar LRC;
    uchar SlaveAddr;
    uint RegCount;
    uchar OutCount;
    uchar ByteCount;
    uchar ErrCount = 0;
Repeat:
    SlaveAddr = 2;
    RegCount = 1;
    OutCount=0;
    ByteCount=2;
    FrameBuffer[0]=':';
    /* поле адреса ведомого */
    FrameBuffer[1]=NumToChar(SlaveAddr>>4);
    FrameBuffer[2]=NumToChar(SlaveAddr&0x0F);
    /* поле финкции */
    FrameBuffer[3]=NumToChar(WRITE_REGS>>4);
    FrameBuffer[4]=NumToChar(WRITE_REGS&0x0F);
    /* поле адреса регистра */
    FrameBuffer[7]=NumToChar((RegAddr&0x00F0)>>4);
    FrameBuffer[8]=NumToChar(RegAddr&0x0F);
    RegAddr>>=8;
    FrameBuffer[5]=NumToChar((RegAddr&0x00F0)>>4);
    FrameBuffer[6]=NumToChar(RegAddr&0x0F);
    /* количество регистров */
    FrameBuffer[11]=NumToChar((RegCount&0x00F0)>>4);
    FrameBuffer[12]=NumToChar(RegCount&0x0F);
    RegCount>>=8;
    FrameBuffer[9]=NumToChar((RegCount&0x00F0)>>4);
    FrameBuffer[10]=NumToChar(RegCount&0x0F);
    /* количество байт */
    FrameBuffer[13]=NumToChar((ByteCount&0x00F0)>>4);    
    FrameBuffer[14]=NumToChar(ByteCount&0x0F);
    /* данные регистра */
    FrameBuffer[17]=NumToChar((Data&0xF0)>>4);;
    FrameBuffer[18]=NumToChar(Data&0x0F);
    Data >>= 8;
    FrameBuffer[15]=NumToChar((Data&0xF0)>>4);
    FrameBuffer[16]=NumToChar(Data&0x0F);
    /* контрольная сумма LRC */
    LRC = Calc_LRC((uchar*)&FrameBuffer[1], 18);
    FrameBuffer[19]=NumToChar((LRC&0xF0)>>4);
    FrameBuffer[20]=NumToChar(LRC&0x0F);    
    /* признак конца пакета */
    FrameBuffer[21]='\r';
    FrameBuffer[22]='\n';
    FrameBuffer[23]='\0';
    // отправляем готовый пакет  
    do
    {
        while(UCSRA_UDRE == false);    
        UDR = FrameBuffer[OutCount++];
    }
    while(FrameBuffer[OutCount] != '\0');
    // ждём ответа
    SetTimeOut(WaitTime);
    PackedReady = false;
    FrameLen = 0;
    while(PackedReady == false && TimeOut>0);
    if(TimeOut == 0)
    {
        if( ++ErrCount == 4 )
        {
            return TIME_OUT_ERR;
        }
        else goto Repeat;
    }
    RemoveTimeOut();
    FrameLen -= 4;
    LRC = CharToNum(FrameBuffer[FrameLen]);                     // декодируем LRC    ASCII -> число        
    LRC <<= 4;
    LRC |= CharToNum(FrameBuffer[FrameLen+1]);
    if(LRC == Calc_LRC((uchar*)&FrameBuffer[1], FrameLen-1))     // проверяем LRC
    {
        return NORMAL;
    }    
    else
    {
        if( ++ErrCount == 4 )
        {
            return CRC_ERR;
        }
        else goto Repeat;
    }
}

uchar Calc_LRC(uchar *Msg, uchar DataLen)
{
    unsigned char uchLRC=0; /* Инициализация LRC */
    unsigned char Byte;
    DataLen>>=1;
    while(DataLen--)
    {        
        Byte=CharToNum(*Msg++);
        Byte<<=4;
        Byte|=CharToNum(*Msg++);
           uchLRC+=Byte;
    }
    uchLRC=(0xFF-uchLRC); //первое дополнение
    uchLRC++;    // второе дополнение
    return (uchLRC);
}


Под Си не нашел ещё есть вот это (под Delphi)
Причина редактирования: Использование [codebox]

Прикрепленные файлы
Прикрепленный файл  delphimodbus_1.0.1.zip ( 36.4 килобайт ) Кол-во скачиваний: 137
 
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 12 2009, 07:57
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(birden @ Nov 13 2008, 12:44) *
M-Bus это Modbus?
Нет совсем другое.
Цитата(Tcom @ Feb 11 2009, 00:05) *
Познать хотя бы C++Builder или Visual Studio
Это совсем не обязательно и даже м.б. лишним. Если программируете под windows, то и изучайте его API в части коммуникаций.
Там обратите внимание на следующие функции:
Код
        Handle = CreateFile( GetLongName(PortNumber),       // Имя порта.
                             GENERIC_READ | GENERIC_WRITE,  // Ресурс для чтения и записи.
                             0,                             // устройство связи должно быть открыто для монопольного доступа.
                             NULL,                          // Нет атрибутов защиты.
                             OPEN_EXISTING,                 // Вернуть ошибку если ресурс не существует.
                             0,                             // Нет перекрытый с I/O.
                             NULL );                        // Для коммуникационных устройств параметр hTemplate д.б. NULL.

        result = ReadFile(                    // BOOL WriteFile(
                           Handle,            // HANDLE hFile,
                           pValue,            // PCVOID lpBuffer,
                           sizeof(*pValue),   // DWORD nNumberOfBytesToWrite,
                           &NumberOfReaded,   // PDWORD lpNumberOfBytesWritten,
                           NULL );            // POVERLAPPED lpOverlapped);

        result = WriteFile(                   // BOOL WriteFile(
                           Handle,            // HANDLE hFile,
                           &value,            // PCVOID lpBuffer,
                           sizeof(value),     // DWORD nNumberOfBytesToWrite,
                           &NumberOfWritten,  // PDWORD lpNumberOfBytesWritten,
                           NULL );            // POVERLAPPED lpOverlapped);


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 23:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01431 секунд с 7
ELECTRONIX ©2004-2016