USB WatchDog ARU-P2 (TOIC)
Наш самый функциональный сторожевой таймер: встроенный язык программирования TOIC позволяет модифицировать логику под самые разные задачи.
Внимание: Данное устройство находится в стадии бета-тестирования!
Присылайте свои замечания и предложения на main@open-dev.ru
Зачем нужны сторожевые таймеры?
Сторожевой таймер используется для контроля ПК и обеспечения его бесперебойной работы в случаях, когда встроенные средства не спасают.

Типовые примеры применения:
  • Обеспечение бесперебойной работы терминала.
  • Автономный компьютер выполняет работу без присмотра персонала.
  • Увеличение надёжности промышленного ПК.
  • GPU-майнер работает нестабильно, а программные средства не помогают.
Как это работает?
Сторожевой таймер подключается через USB интерфейс к ПК. Проводом он напрямую соединяется с контактами Reset или Power материнской платы.
Программа-монитор запускается на ПК и переодически передает сигнал устройству. Если компьютер завис, то зависает и программа: watchdog перестаёт получать сигнал. Через заданное время USB WatchDog автоматически подает сигнал на контакт Reset материнской платы, чтобы перезагрузить систему.
Если Reset не сработал, активируется канал Power, который выключает и снова включает компьютер.
Примечание: Благодаря встроенному языку программирования TOIC пользователь может изменять алгоритм работы в очень широких пределах. Пример программы приведён в нижней части страницы.
Установка USB WatchDog ARU-P2
1. Перед установкой необходимо выключить ПК.
2. Так как устройство бескорпусное, будьте с ним предельно острожны - не допускайте касания металлических поверхностей. Это может привести к порче устройства!
3. Провода Reset и Power необходимо подключить вместо кнопок от системного блока.
4. Как подключать PBD10

Для при установке устройства в материнскую плату убедитесь, что вы подключаете именно к разъему USB. Некоторые интерфейсы (например ieee1394 или COM-порт) имеют на плате такие же 10-выводные разъемы.

Подключение к интерфейсу, отличному от USB, приведет к порче устройства
(возможно с дымом и запахом)!


  • На плате с PBD10 разъемом на плате имеется точка. При подключении к материнской плате ПК она должна быть совмещена со стороной разъема где отсутствует 1 металлический контакт
5. Сами кнопки можно подключить к сторожевому таймеру, чтобы ими тоже можно было пользоваться.
WatchDog Pro2 PBD10
Осн.1 и Доп.1. - параллельно соединённые контакты канала 1. По-умолчанию, подключаются к контактам Reset: например, Осн.1 - на reset мат.платы и Доп.1 - на кнопку reset.
Осн.2 и Доп.2. - параллельно соединённые контакты канала 2. По-умолчанию, подключаются к контактам Power: например, Осн.2 - на power мат.платы и Доп.2-
на кнопку power.
Пример подключения к материнской плате
Драйвер
Работа в ОС ниже Windows7 не поддерживается.
В Windows7 понадобится установить драйвер CDC.
В Windows 8, Windows 10, Linux, macOS установка драйвера не требуется.
Если в Windows8 не заработал системный драйвер CDC, воспользуйтесь инструкцией.
Программа-монитор WDT Monitor ARU-P2
Кроссплатформенная графическая
программа-монитор
Программа под Windows/Linux/macOs подключается к устройству через последовательный порт и обеспечивает следующий функционал:
  • отправка сигнала о работе
  • чтение текущей температуры
  • чтение история событий (лог)
  • тестовые команды Reset и Power
  • остановка и перезапуск сторожевого таймера

Скачать программу можно по ссылке.
После установки ПО
Как проверить, что всё работает как положено
1. После установки и настройки программного обеспечения на устройстве должен начать мигать кружок в левом верхнем углу - это означает, что устройство находится в штатном режиме.

2. В программе-мониторе есть команды для тестовой проверки работы перезагрузки пк.
Необходимо в ручном режиме убедиться, что провода reset и power подключены правильно. Для этого нужно нажать на кнопку Test Power или Test Reset. ПК должен перезагрузиться. Если ничего не произошло, нужно проверить, что подключение сделано верно или поменять полярность подключения проводов на каналах "Reset" и "Power" .
Скрипты для ПК
Можно не устанавливать каких-либо программ, а просто добавить в автозагрузку BAT или BASH скрипт
Минимальный скрипт (bat) для Windows
Скрипт подает раз в секунду команду на порт COM12 - сообщает устройству, что пк не завис.

@echo off
SET portname=COM12
:loop
set /p x="\xc0\x00\x02\xff\xff\xff\xffUS\xc0" <nul >\\.\%portname%
ping -n 2 127.0.0.1 > nul
goto loop

Минимальный скрипт (bash) для Linux
Скрипт подает раз в секунду команду на порт /dev/ttyACM0- сообщает устройству, что пк не завис.

#!/bin/bash
PORT=/dev/ttyACM0
while true
do
 echo -n "\xc0\x00\x02\xff\xff\xff\xffUS\xc0" > $PORT
 sleep 1
done

Скрипт (bat) для проверки сети в Windows
Проверяет доступность узла, заданного параметром hostname.
Переменная portname задает порт устройства.
Командой ping -n 2 127.0.0.1 создается пауза, равная n-1 секунд.

@echo off
SET hostname=ya.ru
SET portname=COM12
:loop
  ping -n 1 -l 4 -w 1000 %hostname% >nul
  if %errorlevel%==0 set /p x="\xc0\x00\x02\xff\xff\xff\xffUS\xc0" <nul >\\.\%portname%
  ping -n 2 127.0.0.1 > nul
goto loop

Скрипт (bash) для проверки сети в Linux
Проверяет доступность узла, заданного параметром hostname.
Переменная portname задает порт устройства.
Командой ping -n 2 127.0.0.1 создается пауза, равная n-1 секунд.

#!/usr/bin/env bash
HOST="ya.ru"
PORT=/dev/ttyACM0
while true
do
    if ping -c 1 $HOST; then
    echo -n "\xc0\x00\x02\xff\xff\xff\xffUS\xc0" > $PORT
    fi
sleep 3
done

Скрипт (bash) для отслеживания процесса в Linux
По-умолчанию мониторит процесс, заданный переменной PROCESS,
можно запустить с параметром "имя процесса".

#!/usr/bin/env bash

PORT=/dev/ttyACM0
PROCESS=crond

if [ ! -z "$1" ];then
	PROCESS="$1"
	echo "Monitor $PROCESS"
fi

while true; do
	if pgrep "$PROCESS" > /dev/null; then
		echo -n "\xc0\x00\x02\xff\xff\xff\xffUS\xc0" > $PORT
	fi
	sleep 3
done

Скрипт (bash) для отслеживания процесса и сетевого соединения в Linux
По-умолчанию мониторит процесс, заданный переменной PROCESS и сетевой адрес, заданный параметром HOST.
Можно запустить с параметрами: -a <url> для смены ya.ru на <url>, -p <proc> для смены crond на <proc>

#!/usr/bin/env bash

PORT=/dev/ttyACM0
URL=ya.ru
PROCESS=crond

while getopts ":ha:p:" opt; do
	case ${opt} in
		a)
			URL=$OPTARG
			;;
		p)
			PROCESS=$OPTARG
			;;
		h)
			echo "Usage: $0 -a <url> -p <process>" 1>&2
			exit 1
			;;
		\?)
			echo "Invalid option: -$OPTARG" 1>&2
			exit 1
			;;
	esac
done

echo "Ping $URL"
echo "Monitor $PROCESS"

while true; do
	ping -n -c 1 -w 1 "$URL" 2>/dev/null 1>&2 && pgrep "$PROCESS" 2>/dev/null 1>&2 && echo -n "\xc0\x00\x02\xff\xff\xff\xffUS\xc0" > $PORT
	sleep 3
done

Пример считывания температуры на Python3
Пример получения данных с термодатчика. Это упрощённый код для понимания принципов работы. Не используйте его в реальных проектах.

from time import sleep
import serial

port = '/dev/tty.usbmodem14101'
ser = serial.Serial(port, timeout=0.05)

while True:
    ser.write(b'\xc0\x00\x02\xff\xff\xff\xffTR\xc0')
    ser_data = ser.readall()
    if ser_data and ser_data.startswith(b'\xc0'):
        k = int(ser_data[8:12].decode())/10
        c = k - 273
        print('Read from serial: {0}'.format(c))
    sleep(3)
Пример считывания лога на Python3
Пример получения лога. Это упрощённый код без работы с протоколом и защит от ошибок. Не используйте его в реальных проектах. В ответ приходит 50 байт: 10 пакетов в формате ts[4]+act. Значения ts - unix timestamp. Значения act: 0 - старт устройства, 1 - reset, 2 - reboot. Буфер циклически перезаписывается. После получения необходимо отсортировать данные по времени самостоятельно.

При использовании лога необходимо периодически проводить синхронизацию часов, чтобы обеспечить точность показаний.
Это упрощённый код для понимания принципов работы. Не используйте его в реальных проектах.

from time import sleep
from binascii import hexlify
import serial

port = '/dev/tty.usbmodem14101'
ser = serial.Serial(port, timeout=0.05)

while True:
    ser.write(b'\xc0\x00\x02\xff\xff\xff\xffLJ\xc0')
    ser_data = ser.readall()
    if ser_data and ser_data.startswith(b'\xc0'):
        print(hexlify(ser_data[8:-2]))
    sleep(3)

Подключение термодатчика
Контроль над температурой с помощью
USB WatchDog ARU-P2
Ко входу Вх/In USB WatchDog ARU-P2 можно подключить внешний термодатчик на базе DS18B20. Для этого к «-» входа подключаются объединённые контакты GND и VDD датчика DS18B20, а к «+» DQ датчика.

При подключенном термодатчике можно периодически считывать данные о температуре. Данные следует считывать не чаще, чем 1 раз в 3 секунды.


Подключение входного дискретного сигнала: концевика, кнопки.
Для активации режима следует изменить программу устройства.
Ко входу Вх/In USB WatchDog возможно подключение нормальнозамкнутого/нормальноразомкнутого концевого датчика согласно рисунку.
Значение данного входа можно программно считывать с помощью текстового протокола.

Следует помнить, что вход идет напрямую на процессор. Подача на этот вход сигналов напряжением выше 3.6В и ниже -0.6В приведет к порче процессора.

Программируем сами
Модификация встроенного ПО
Сердцем сторожевого таймера является микроязык TOIC, который позволяет легко модифицировать встроенное программное обеспечение устройства.
Код, работающий в устройстве.
Код, который работает в устройстве по-умолчанию.

//Main settings
#define TIMER_MAX 5500
#define TIMER_DELTA 50
#define RESET_TIME 200
#define POWER_OFF_T1 5000
#define POWER_OFF_DELAY 3000
#define POWER_OFF_T2 200

//hw defines
#define LED_PIN PF0
#define RESET_PIN PA3
#define POWER_PIN PA2
#define LOG_SIZE 50

//global
var led_on();
var counter;
var phase = 0;
var mem_start;
var mem_ptr = 0;

//functions

var led_off(){ 
    LED_PIN.VALUE = 0;
}

var reset() {
    RESET_PIN.VALUE = 0;
    sleep(RESET_TIME);
}

var reboot() {
    led_off();
    POWER_PIN.VALUE = 0;
    sleep(POWER_OFF_T1);
    POWER_PIN.VALUE = 1; 
    sleep(POWER_OFF_DELAY);
    POWER_PIN.VALUE = 0;
    sleep(POWER_OFF_T2);
}

var logger() {
    sprintf(mem_start + mem_ptr, "%p%c", TIME.EPOCH, phase);
    mem_ptr = ((mem_ptr+5) % LOG_SIZE);
}

var reinit() {
    RESET_PIN.VALUE = POWER_PIN.VALUE = 1;
    counter = TIMER_MAX;
    timer(TIMER_MAX, led_on);
}

var get_temp()
{
  DS18.INIT = DS18_PORT_B|8;
  if(DS18.INIT == 1)
  {
    DS18.VALUE = 1;
    delay(100);
    return DS18.VALUE;
   }else
   return 0;
}

var _msg() {
      var c = stoi(&MSG.RX, 'c');
      if (c == 'T') {
        sprintf(&PC.TX, "T%p", get_temp());
      } else
      if (c == 'L') {
          sprintf(&PC.TX, "L%r", mem_start, LOG_SIZE);
      } else
      {
          sprintf(&PC.TX, "%c", c);  // echo
          switch (c) {
              case 'U':
                  counter = TIMER_MAX;
                  break;
              case 'S':
                  tstop(led_on);
                  break;
              case 'R':
                  reset();
                  reinit();
                  break;
              case 'P':
                  reboot();
                  //break;
              case 'E':
                  reinit();
                  break;
              default:
                  break;
          }
      }
}

var led_on() {     
    LED_PIN.VALUE = 1;
    if (counter) {
      __disable_irq();
      counter -= TIMER_DELTA;
      __enable_irq();
      timer(TIMER_DELTA-1, led_off);
      timer(counter, led_on);
    }
    else { //time is up
        logger(); 
        if (phase) {
            reboot();
            phase = 0;
        }
        else {
            reset();
            phase = 1;
        }
        reinit();
    }
}

var main() {
    mem_start = SYS.RAM;
    LED_PIN.MODE = GPIO_MODE_OUTPUT|GPIO_OTYPE_PP|GPIO_INIT_LOW;
    RESET_PIN.MODE = GPIO_MODE_OUTPUT|GPIO_OTYPE_PP|GPIO_INIT_HIGH;
    POWER_PIN.MODE = GPIO_MODE_OUTPUT|GPIO_OTYPE_PP|GPIO_INIT_HIGH;
    memset(mem_start, LOG_SIZE, 0);
    SYS.WDG = 1;   
    reinit();
    while(1){
        delay(1000);
        SYS.WDG = 42;
    }
    return 0;
}
Чтобы подключиться к устройству нужно открыть среду ToicIDE, для этого необходимо нажать на кнопку в левом верхнем углу и выбрать порт устройства.
Дополнительные ресурсы

  • 1
    Программа-монитор wdtmon-t
    Программа-монитор для USB WatchDog ARU-P2. Написана на go.
    Собрана под Windows/Linux/macOS. Скачать программу можно по ссылке.
  • 2
    Сайт TOIC
    Сайт проекта TOIC Platform, где можно подчерпнуть основные сведения по работе с платформой TOIC. Перейти.
  • 3
    TOIC book
    Книга-справочник по языку TOIC. Перейти.