По следам публикаций 1С + микроконтроллер, или 1С в железе




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

13 Comments

  1. blackhole321

    Это нормальное, жизнеспособное направление, однако web-сервер & wi-fi на контроллере, надо-бы заменить, скажем шиной CAN. Ну и конечно, нормально прорабатывать схемотехнику, тогда о:

    В общем практика показала, что на ардуино не так легко добиться стабильно работающего кода

    можно будет практически забыть.

    Reply
  2. vostok1.dz

    (1)Под web-сервером, я имею ввиду любое устройство, собранное на микроконтроллере, канал связи и протокол передачи могут быть самыми разными. Тут всё зависит от человека, реализующего эту схему, кто в чем разобрался. Просто модули web-серверов наиболее простые в освоении и 1С позволяет, достаточно простую интеграцию, с такими устройствами. Мне хватило нескольких недель, что бы разобраться, с нуля и до стабильно работающего устройства, и цена вопроса (затраты, на железки) порядка 2-3 т.р.. И у меня схема работы сложилась достаточно стандартная — я делаю пробую, отрабатываю решение, а дальше идет профессиональная команда автоматчиков, и удачные решения реализуются, с помощью стандартной автоматизации. Тут еще одна фишка, после меня много не спрашивают (денег), т.к. реализовать уже то что работает, гораздо проще…

    Reply
  3. blackhole321

    Просто модули web-серверов наиболее простые в освоении и 1С позволяет, достаточно простую интеграцию, с такими устройствами

    Оборотная сторона — надёжность канала связи и системы в целом, тем более, что Вы не светодиодами мигаете, а средства промышленной автоматики разрабатываете.

    Ну и надеюсь, что Вы не используете 1С для отправки низкоуровневых команд управления, критичных по времени etc.

    Reply
  4. vostok1.dz

    (3)А что 1С это система реального времени или SCADA какая нибудь? в микроконтроллерах можно запоминать определенный «кусок» информации в SD карту, и когда будет очередной запрос в ту ли другую сторону передавать или принимать информацию…

    И еще один большой плюс — с 1С как раз не надо поддерживать постоянную связь, связь асинхронная, и даже WiFi показал достаточную стабильность, если например раз 2-3 минуты пересбрасывать (сторожевой таймер) модули WiFi, и еще через некоторое время перезагружать сам микроконтроллер. Есть 3 реальные системы в работе у которых uptime уже составил более пол года, больше всё равно не надо…

    Надежность этих систем, в моих случаях, подтверждена на 100%, самая первая система работает уже четыре года, и причем на участке, где была внедрена, освободилось 2 человека. Экономию посчитать не сложно, без учета брака, который за последние годы снизился до очень маленьких показателей…

    А в общем Вы задаете вопросы по «железу» и окружению, которые решаются достаточно просто и быстро, не работают одни настройки — поменяли, не работает оборудование так ка планировалось — заменили, все происходит достаточно быстро и дешево, в отличии от классического подхода, ведь суммы которые необходимы в этом случае составляют менее 10 т.р.

    Когда сделали систему — Проект -> ТЗ -> Закупка оборудования -> Программирование -> Реализация и в итоге, что то не предусмотрели, у меня такое «сплошь и рядом», а изменить что то просто уже не возможно или просто дорого.

    Я как раз и пытаюсь донести, что часто легче изготовить прототип (смотрим выше руководитель часто не знает что хочет, кроме доп. прибыли конечно), посмотреть как работает, сколько будет экономии, от внедрения проекта, а затем уже составить нормальное ТЗ и реализовать на стандартной автоматике, которую будет легко поддерживать и обслуживать, или как вариант сделать встроенную свою систему, для поддержки которой, конечно нужны более продвинутые специалисты.

    А по поводу низкоуровневых команд надо подумать))), пока в голову приходит идея включать дяде Феде свет на токарном станке, или будильник, что бы не спали )))

    Reply
  5. blackhole321

    (4)


    что 1С это система реального времени или SCADA какая нибудь?/QUOTE]

    Ну так я это и имел ввиду. В качестве SCADA ещё может быть, но весь низкоуровневых рантайм на контроллерах.

    [IS-QUOTE]

    И еще один большой плюс — с 1С как раз не надо поддерживать постоянную связь, связь асинхронная, и даже WiFi показал достаточную стабильность, если например раз 2-3 минуты пересбрасывать (сторожевой таймер) модули WiFi, и еще через некоторое время перезагружать сам микроконтроллер. Есть 3 реальные системы в работе у которых uptime уже составил более пол года, больше всё равно не надо…

    Между 1с и контроллерами возможно не надо, а между контроллерами если их больше 1 надо :). И судя по сторожевым таймерам, перезагрузкам контроллеров etc. WiFi в исполнении ардуино — не лучший транспорт.

    Конечно все определяется задачами и возможными последствиями. Одно дело, если сигнал не дойдёт и светодиод продолжит гореть и совсем другое, если нагревательный элемент, скажем котла продолжит нагрев, не получив информацию от датчика.

    И собственно я не спорю с Вами относительно преимуществ, они определённо есть, я лишь пытаюсь донести мысль, что надо изначально по возможности пользоваться промышленными стандартами при разработке промышленных решений.

    Reply
  6. vostok1.dz

    (5)В ответ могу сказать, что я совсем не собираюсь управлять чем то из 1С. В 1С я предпочитаю просто считать деньги, смотреть отчеты, сохранять другую полезную информацию. Я просто, с помощью микроконтроллера, собираю информацию со станков в 1С, и очень редко передаю что то обратно.

    Согласен, что с помощью промышленных стандартов, всё надежнее и проще в исполнении, но дороже (в моем случае), и дольше по времени. И эти факторы для меня являются определяющими.

    Про перезагрузку WiFi хотел уточнить (не было возможности исправить), если нет связи 2-3 минуты, то перезагруз, просто частенько на участке ведутся сварочные работы, да и промышленное питание оставляет желать лучшего, модули WiFI использую WFPR200(М), для ОВЕН ПР200 или для UART, в общем достаточно стабильная штука…

    И про ардуино то же писал, что там нет стабильности, и пишу на Си, в AtmelStudio 7, используя готовые шилды от Ардуино или других производителей, с микроконтроллерами AVR. Конечно посматриваю в сторону STM, но функционала 8 битных микроконтроллеров, для меня больше чем достаточно, т.к. в микроконтроллере реализовать ModBus-slave(master) и web-сервер по проводу на AVR-ках проще простого…

    Reply
  7. blackhole321

    (6)

    В ответ могу сказать, что я совсем не собираюсь управлять чем то из 1С.

    Я просто, с помощью микроконтроллера, собираю информацию со станков в 1С, и очень редко передаю что то обратно.

    Тогда вопросов нет, можно и WiFi или что-то еще.

    Reply
  8. 3vs

    «Ещё очень характерная причина, сложностей внедрения автоматизации таких производств — отсутствие соответствующего образования у руководителей, т.к. устраивают на ключевые должности родственников и знакомых, в последнюю очередь обращая внимание на образование и дальнейшее обучение.»

    Об этом пишет в своей книге «Лестница в небо» товарищ Хазин, препарируя

    сущность власти.

    Да, на ключевых должностях родственники и знакомые…

    Reply
  9. par_62

    Родственники и т.п. очень скоро пииводят либо к краху либо к их разгону. Но к нашей теме не о носится. Тема интересная,но все таки проще оперировать тем же С/С+× в связке через ,например внешние компоненты, с 1с.

    Reply
  10. acanta
  11. Rustig

    (0) реализация красивая, а можете озвучить задачу? что получаете от контроллера, что и зачем обрабатываете в 1С? какой бизнес-процесс автоматизировали? как вышло , что двух человек освободили от некой работы?

    Reply
  12. vostok1.dz
    Reply
  13. torbeev

    5+.

    Если не секрет, на каком железе выполнен механизм перемещения рольганга/упора на штапикорезе ? бюджет реализации ? исходя из практики эксплуатации , что то нужно исправлять ?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *