Ïîìîùü - Ïîèñê - Ïîëüçîâàòåëè - Êàëåíäàðü
Ïîëíàÿ âåðñèÿ ýòîé ñòðàíèöû: Îïðîñ com ïîðòà
Ôîðóì ðàçðàáîò÷èêîâ ýëåêòðîíèêè ELECTRONIX.ru > Ñàéò è ôîðóì >  ïîìîùü íà÷èíàþùåìó > Ïðîãðàììèðîâàíèå
FxMODE
Ïðèâåòñòâóþ.
Íóæíî ñäåëàòü çàïðîñ ê ÑÊÑ-3 ïî ïðîòîêîëó M-Bus. Îïûòà ðàáîòû ñ ïðîòîêîëàìè íå áûëî, äà è ïðèìåðîâ íàéòè íå ìîãó. Åñòü ñòàíäàðòíûé ìàíóàë, ýò êîíå÷íî õîðîøî. Íî íóæåí ëþáîé ïðèìåð çàïðîñà, ïðîñòî ïîêàæèòå êàê ýòî äåëàòü.
Çàðàíåå ñïàñèáî
birden
M-Bus ýòî Modbus?
Åñëè äà, òî íóæíî ñìîòðåòü â "ñíàíäàðòíîì ìàíóàëå" îïèñàíèå ðãèñòðîâ/âõîäîâ/âûõîäîâ ýòîãî ñàìîãî ÑÊÑ-3, è ñäåëàòü ñîîòâåòñâóþùèé çàïðîñ. Çäåñü íà ôîðóìå ôîðìàò çàïðîñà ïî Modbus ãäå-òî áûë ïîêàçàí, åñëè íå îøèáàþñü.
FxMODE
Ïðèâåò! Åñòü äâà êîìïà, ñîåäèíåíû íóëü ìîäåìíûì êàáåëåì ÷åðåç êîìïîðò. Ñ îäíîãî ïîñûëàþòñÿ ñèìâîëû ñ Òåðàòåðìà. Êàê ñ ïîìîùüþ Ñè ðåàëèçîâàòü ëîâëþ ýòèõ ñèìâîëîâ íà äðóãîì êîìïå? Çàðàíåå ñïàñèáî
Tcom
Ïîçíàòü õîòÿ áû C++Builder èëè Visual Studio
clpe
Öèòàòà(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)
demiurg_spb
Öèòàòà(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);
Äëÿ ïðîñìîòðà ïîëíîé âåðñèè ýòîé ñòðàíèöû, ïîæàëóéñòà, ïðîéäèòå ïî ññûëêå.
Invision Power Board © 2001-2025 Invision Power Services, Inc.