<Corrected> Мастер IO-Link отправляет только два октета M-последовательности - PullRequest
0 голосов
/ 14 января 2020

Я использую приемопередатчик устройства TIOL111 IO-Link.

Я написал начальную часть протокола связи с типом M-последовательности 0, но Мастер несколько раз посылает два запроса (с адресами 0x02 и 0x03) , Все ответы верны. Когда я подключаю модуль Balluff I / O (BNI IOL -...), мастер по очереди отправляет сообщения с адресами 0x02 0x03 0x04 0x05 0x06 ..., но когда я подключаю свое устройство к тому же порту, он отправляет только первые два , Я использую приемопередатчик устройства IO-Link TIOL111.

Кто-нибудь знает этот протокол связи и может мне помочь?

void iol_operate()
{
    if (uart_rx_available() > 0)
    {
        OctetMC = uart_get();
        while (uart_rx_available() == 0) {}
        if (iol_checksum_compression(0x52 ^ OctetMC) != (uart_peek() & 0b00111111)) return;
        OctetCKT = uart_get();

        ReadWrite = (OctetMC >> 7) & 0b1;
        CommunicationChannel = (OctetMC >> 5) & 0b11;
        Address = OctetMC & 0b11111;
        MSeqType = (OctetCKT >> 6) & 0b11;

        Checksum = OctetMC ^ OctetCKT;

        switch (MSeqType)
        {
            case 0: iol_m_sequence_type_0();
            break;
            case 1: iol_m_sequence_type_1();
            break;
            case 2: iol_m_sequence_type_2();
            break;
        }

        OctetCKS = iol_checksum_compression(Checksum) | (ProcessDataStatus << 6) | (EventFlag << 7);
        uart_put(OctetCKS);
        iol_set_en_out();
        iol_default_variables();
    }
}

void iol_m_sequence_type_0()
{
    if (ReadWrite)      // READ
    {
        switch (Address)
        {
            case 0x02: OctetOD = MIN_CYCLE_TIME;
            break;
            case 0x03: OctetOD = (M_SEQ_SETTING_PREOPERATE << 4) | (M_SEQ_SETTING_OPERATE << 1) | ISDU_SUPPORT;
            break;
            case 0x04: OctetOD = IOL_REV;
            break;
            case 0x05: OctetOD = (PROCESS_DATA_IN_BYTE << 7) | (SIO_SUPPORT << 6) | PROCESS_DATA_IN_LENGTH;
            break;
            case 0x06: OctetOD = (PROCESS_DATA_OUT_BYTE << 7) | PROCESS_DATA_OUT_LENGTH;
            break;
            case 0x07: OctetOD = (VID >> 8) & 0xFF;
            break;
            case 0x08: OctetOD = VID & 0xFF;
            break;
            case 0x09: OctetOD = (DID >> 16) & 0xFF;
            break;
            case 0x0A: OctetOD = (DID >> 8) & 0xFF;
            break;
            case 0x0B: OctetOD = DID & 0xFF;
            break;
            default:    // Complete the code
            break;
        }

        Checksum ^= OctetOD;
        _delay_ms(1);
        EN_OUT;
        uart_put(OctetOD);
    }
    else        // WRITE
    {
        while (uart_rx_available() == 0) {}
        OctetOD = uart_get();
        Checksum ^= OctetOD;

        switch (OctetOD)
        {
            // Complete the code
        }

        EN_OUT;
    }
}

void iol_set_en_out()
{
    while (uart_tx_available() != 0) {}
    _delay_ms(5);
    EN_IN;
    uart_flush();
    _delay_ms(1);
}

Я исправил этот вопрос: Мастер IO-Link отправил только два Октет М-последовательности

...