Modbus TCP / RTU RS-485 + WEB server

pvvx

Активный участник сообщества
т.е дело точно не в размере?
Безусловно не в размере.

Стоит только разрешить USE_RS485DRV и все, такое чувство что где-то висим, как это отловить не могу сообразить, вставлял в разные места инициализацию SPI карты, ничего не меняется. Возможно драйвер конфликтует с SPI, ведь ноги там общие?
Драйвер использует RX/TX пины и заданный пин переключения направления драйвера RS-485.
Конфликты по пинам, если они есть, поищите сами. Я с ESP8266 завязал и не хочу больше на нем ничего собирать или проверять...
Возможно нарушения не в пинах, а в инициализации.
Во первых инициализация и работа драйвера SD должна происходить после инициализации SDK (и WiFi).
Во вторых у меня используются другие хидеры для описания внутренних регистров ESP8266 и вам надо или менять пути к заголовкам или собирать драйвер SPI со своими #include. Можно, возможно и будет проще, собрать драйвер SD отдельной либой, вообще в другом проекте, прикрутить полученную либу и вызывать процедуры из неё...
Вариантов может быть множество и угадать сложно, что там у вас не стыкуется.
 

Urbas81

Member
Безусловно не в размере.


Драйвер использует RX/TX пины и заданный пин переключения направления драйвера RS-485.
Конфликты по пинам, если они есть, поищите сами. Я с ESP8266 завязал и не хочу больше на нем ничего собирать или проверять...
Возможно нарушения не в пинах, а в инициализации.
Во первых инициализация и работа драйвера SD должна происходить после инициализации SDK (и WiFi).
Во вторых у меня используются другие хидеры для описания внутренних регистров ESP8266 и вам надо или менять пути к заголовкам или собирать драйвер SPI со своими #include. Можно, возможно и будет проще, собрать драйвер SD отдельной либой, вообще в другом проекте, прикрутить полученную либу и вызывать процедуры из неё...
Вариантов может быть множество и угадать сложно, что там у вас не стыкуется.
Спасибо, если не в размере, поковыряю еще, сам драйвер я как-то собрал, добавлял недостающие регистры, по Modbus TCP все работает и пишет на карточку, делал проверку писал каждую секунду 10 регистров, файл 130 mB записывался корректно, без сбоев.
 

Deuce

New member
Я дико извиняюсь, если туплю, но не разъясните мне такой момент: эта прошивка позволяет модбасом управлять GPIO самой ESP, или она только делает доступными ячейки памяти, которые синхронизируются с адресами модбаса находящиеся на МК, к которому подключена ESP? Сразу поясню, что я не программист ниразу и с модбасом познакомился сравнительно недавно.
 

pvvx

Активный участник сообщества
Я дико извиняюсь, если туплю, но не разъясните мне такой момент: эта прошивка позволяет модбасом управлять GPIO самой ESP, или она только делает доступными ячейки памяти, которые синхронизируются с адресами модбаса находящиеся на МК, к которому подключена ESP? Сразу поясню, что я не программист ниразу и с модбасом познакомился сравнительно недавно.
Производится и то и другое.
Откройте папку и запустите файл WEBFilesRS485/help/webvars.htm
или на самом модуле с прошивкой на первой странице "Info".
Вкладка "modbus" (в низу страницы).
Там указаны адреса modbus "Системные переменные" и в них есть ячейки управляющие GPIO.
 
Последнее редактирование:

chip12

New member
Излазил весь форум за неделю, ответа так и не нашел, хотя вопрос поднимался не однажды.
Имеем к-line, это однопроводная линия, для обмена по OBD протоколу, скорости 200 и 10400 бот. Попробовал на прошивке TCP2UART , ведь к-line можно развести на RX и TX, данные передавать получается на скорости 10400, но запуск происходит на скорости 200 бот, а осуществить поддержку 2х скоростей в прошивке TCP2UART, не получится. Есть мысль что прошивка RTU RS-485 с этим, логически, должна справится, но знаний в этой сфере не хватает. Может кто подтолкнет на идею?
почему не получилось на tcp2uart? Вот имеем такой запрос, первый импульс это для скорости 200 бот, передать такую длительность 25мс со скоростью 10400 не получается, а далее скорость включается 10400 .
NewFile1.jpg
 

Deuce

New member
Производится и то и другое.
Откройте папку и запустите файл WEBFilesRS485/help/webvars.htm
или на самом модуле с прошивкой на первой странице "Info".
Вкладка "modbus" (в низу страницы).
Там указаны адреса modbus "Системные переменные" и в них есть ячейки управляющие GPIO.
Спасибо, с модбасом разобрался. Возник другой вопрос: а есть возможность к GPIO подключить ds18b20 и писать значение с него в ячейку модбаса?
 

pvvx

Активный участник сообщества
Возник другой вопрос: а есть возможность к GPIO подключить ds18b20 и писать значение с него в ячейку модбаса?
Надо дописывать модуль работы с ds18b20 на СИ в SDK. C 1-Wire примеров для web-свалки не делал.
 

Urbas81

Member
Нужна помощь в таком вопросе: как оптимизировать скорость скачивания с SD карты , сейчас использую функцию по аналогии с сохранением flash из web_int_callbacks.c, но если при скачивании fullflash скорость ~400 KB/sec, то при скачивании функцией f_gets строк из файла на карте, скорость стартует ~70-90 KB/sec и затем со временем снижается до ~30 KB/sec, каждый раз по разному, иногда скачивание останавливается не дойдя до конца. Библиотека FatFS.

Код:
void ICACHE_FLASH_ATTR sd_file(TCP_SERV_CONN *ts_conn)
{

        int i=150;
        FIL fsrc;
        FRESULT res;
        static uint32 n;
        char CharBuffer[100];
        char * line;
        WEB_SRV_CONN *web_conn = (WEB_SRV_CONN *) ts_conn->linkd;



//*********************************************************************
        os_sprintf_fd(name1, "0:%s", sdcfg.str1);
        res = f_open(&fsrc, name1, FA_OPEN_EXISTING | FA_READ);
        f_lseek(&fsrc, n);


//********************************************************************************************

while(i>0){
    i--;
    if(web_conn->msgbuflen + (9+3*16+17+2) <= web_conn->msgbufsize) {

//********************************************************************************************
            if(res == FR_OK)
            {

                    res = f_lseek(&fsrc, n);
                    f_gets(CharBuffer, 100, &fsrc);
                    line = (char *) os_malloc(strlen(CharBuffer) + 1);
                    strcpy(line, CharBuffer) ;
                    n=n+(strlen(line));

                    tcp_puts("%s", line);
           
                    os_free(line);

                    if(n>=fsrc.fsize)
                    {
                    n=0;
                    i=0;
                    f_close(&fsrc);
                    ClrSCB(SCB_RETRYCB);
                    SetSCB(SCB_FCLOSE | SCB_DISCONNECT); // connection close
                    return;
                    }
//*****************************************************************************************
            }
            else
            {
//*****************Восстановление после неудачного скачивания файла*********************************
                    n=0;
                    i=0;
                    f_close(&fsrc);

                    ClrSCB(SCB_RETRYCB);
                    SetSCB(SCB_FCLOSE | SCB_DISCONNECT); // connection close
                    return;
            }
//*********************************************************************************************
    }
    else
    {
    i=0;
    }



}

    f_close(&fsrc);           
    // repeat in the next call ...
    SetSCB(SCB_RETRYCB);   
    SetNextFunSCB(sd_file);
    return;

}
Пробовал читать не строками, а блоками, на скорость особо не повлияло, но добавилась проблема с фрагментацией. Буду рад любым идеям по улучшению.
 

karol16

New member
Привет читатели.
У меня проблема в ESP8266, потому что я написал программу для связи MODBUS после UART, но я должен обратить логику вывода TX и RX в противоположную сторону.
Мне нужно, чтобы при отсутствии данных это было 0, а когда отправлено 1.
Я много читал ваш форум и много репетировал, но ни одна из них не сработала.
Даже это описание не работает.
Я программирую в ARDUINO IDE.
У меня ESP8266 NodeMCU v3.
Я прошу о помощи.
Станислав
 
Сверху Снизу