Стенд для прозвонки до 30 цепей с музыкальный индикацией результата проверки в автономном режиме.
Стенд предназначен для проверки кабелей с суммарным количеством контактов не более 30. На крышке стенда располагаются 8 разъёмов для подключения проверяемых кабелей непосредственно или через соответствующие переходные устройства. В таблице показана конфигурация контактов разъёмов:
№ разъёма | Х1
DB — 25F |
Х2
DB — 9F |
Х3
BH-10-G |
Х4
DB — 9M |
Х5
DB — 9F |
Х6
CAT5 |
Х7
CAT5 |
Х11
DB — 9M |
№ цепи |
Номера контактов |
|||||||
1 – 01h | 1 | 1 | 8 | 1 | ||||
2 – 02h | 2 | 2 | 7 | 2 | ||||
3 – 03h | 3 | 3 | 6 | 3 | ||||
4 – 04h | 4 | 4 | 5 | 4 | ||||
5 – 05h | 5 | 5 | 4 | 5 | ||||
6 – 06h | 6 | 6 | 3 | 6 | ||||
7 – 07h | 7 | 7 | 2 | 7 | ||||
8 – 08h | 8 | 8 | 1 | 8 | ||||
9 – 09h | 9 | 9 | 8 | 9 | ||||
10 – 0Ah | 10 | 10 | 7 | |||||
11 – 0Bh | 11 | 1 | 6 | |||||
12 – 0Ch | 12 | 2 | 5 | |||||
13 – 0Dh | 13 | 3 | 4 | |||||
14 – 0Eh | 14 | 4 | 3 | |||||
15 – 0Fh | 15 | 5 | 2 | |||||
16 – 10h | 16 | 6 | 1 | |||||
17 – 11h | 17 | 7 | ||||||
18 – 12h | 18 | 8 | ||||||
19 – 13h | 19 | 9 | ||||||
20 – 14h | 20 | 1 | ||||||
21 – 15h | 21 | 2 | ||||||
22 – 16h | 22 | 3 | ||||||
23 – 17h | 23 | 4 | ||||||
24 – 18h | 24 | 5 | ||||||
25 – 19h | 25 | 6 | ||||||
26 – 1Ah | 1 | 7 | ||||||
27 – 1Bh | 2 | 8 | ||||||
28 – 1Ch | 3 | 9 | ||||||
29 – 1Dh | 4 | |||||||
30 – 1Eh | 5 |
Стенд обеспечивает:
1) Проверку кабелей, назовём их резидентными, конфигурация которых записана в стенде.
2) Выбор из первых пяти резидентных кабелей с помощью одной из пяти мелодий, записанных в стенде.
3) Выбор из следующих пяти резидентных кабелей с помощью одной из пяти мелодий, записанных в стенде (при включении питания с закороченными контактами цепь 1 – цепь 2).
4) Сокращение длительности проигрываемых мелодий (при включении питания с тумблером “КРАТКО” “УСТРОЙСТВА ВЫБОРА” в положении “ВКЛ”).
5) Выбор из всех резидентных кабелей с помощью “УСТРОЙСТВА ВЫБОРА” (при включении питания с тумблером “ВЫБОР” в верхнем положении, соответствующим номером на переключателе и, если требуется, включённым тумблером “+10” – к номеру на переключателе добавить 10).
6) Проверку кабелей, конфигурация которых загружается с компьютера (при включении питания с тумблером “ЗАГРУЗКА” в положении “ВКЛ” или дождавшись окончания проигрывания пятой мелодии, не нажимая кнопки “ПУСК”).
7) Звуковую индикацию исправности или неисправности кабеля.
8) Вывод на компьютер результатов проверки с указанием конкретных цепей в случае неисправности.
Выше перечислены все возможности выбора, хотя основным вариантом является выбор резидентного кабеля с помощью “УСТРОЙСТВА ВЫБОРА”.
Одновременное включение тумблеров “ВЫБОР” и “ЗАГРУЗКА” в “УСТРОЙСТВЕ ВЫБОРА” не имеет смысла, но при ошибке реализуется режим выбора.
Сокращение длительности проигрываемых мелодий совместимо со всеми режимами.
ВНИМАНИЕ- После включения питания “УСТРОЙСТВО ВЫБОРА” или установленные перемычки должны быть удалены.
В стенде записаны следующие конфигурации: (для публики не имеет значения, поэтому я их удалил из описания за исключения тестовых).
- ТЕСТ №1 НА ЗАМЫКАНИЕ КОНТАКТОВ — подключается к разъёмам Х1 и Х2.
- ТЕСТ №2 НА ОТСУТСТВИЕ ЗАМЫКАНИЙ КОНТАКТОВ.
Тумблер “Звук” используется для отключения динамика.
Разъём “COM” служит для подключения к последовательному порту компьютера с параметрами 19200 — 8 — N — 1 и обеспечивает вывод диагностической информации и загрузку конфигурации дополнительных кабелей. Рекомендуемая программа для работы с последовательным портом — “COM Port Toolkit”.
Выбор проверяемого кабеля можно произвести двумя способами :
1) Подключить к разъёму Х1 “УСТРОЙСТВО ВЫБОРА”, тумблер “ВЫБОР” установить в верхнее положение, установить переключателем номер кабеля (от 0 до 9) и, в случае кабелей из второго десятка, установить тумблер “+10” в положении “ВКЛ”. Включить питание стенда и отсоединить “УСТРОЙСТВО ВЫБОРА”.
2) Коротким нажатием на кнопку “Пуск” во время проигрывания одной из пяти мелодий, последовательно запускаемых после включения питания (для выбора из следующей пятерки включают питание с закороченными контактами цепь 1 – цепь 2) :
— из “Джентльменов удачи” для кабеля интерфейсного или К-61М;
— из “Служебного романа” для К-061 или К-064, К-074;
— “Листья жёлтые” для К-53 или К-066;
— из “Ва Банка” для Crossover или К-56, К-58, К-80 (4-жил.);
— из “Бумера” для К-52 или К-56, К-58 (2-жил.).
Подключение кабелей производится при включённом питании стенда.
Проверка выбранного кабеля начинается после кратковременного нажатия на кнопку “Пуск”. Если проверка прошла успешно проигрывается соответствующая мелодия и, дополнительно, в окно “Принято” программы “COM Port Toolkit” выводится сообщение – “ОК” с порядковым номером проверки, начиная с 1. В случае выявления несоответствий проигрывается звук низкой частоты и, дополнительно, в окно “Принято” программы “COM Port Toolkit” выводятся сообщения типа:
Отсутствует соединение № — №
Лишнее соединение № — №
где № — десятичный номер цепи. Для определения контактов разъёмов следует воспользоваться таблицей и, при использовании переходников, схемами переходников.
При нажатии на кнопку “Пуск” более чем на 1,5 сек производится циклическое тестирование с полной индикацией несоответствий или выводом только сообщения ОК с порядковым номером без звуковой индикации в случае отсутствия несоответствий. Выход из режима циклического тестирования производится кратковременным нажатием на кнопку “Пуск”.
Загрузка конфигурации дополнительных кабелей производится в окне “Отправка сообщения” программы “COM Port Toolkit”. Возможны два варианта загрузки:
— ввод данных в строку “Сообщения”;
— ввод имени файла в строку “Из файла”.
Данные для строки “Сообщения” (как и в загружаемом файле) имеют структуру, аналогичную приведённой ниже
FE 02 15 FE 03 16 FE 04 17 FE 05 18 FE 06 19 FE 07 1A FE 08 1B FE 09 1C FF FC 1C DE C6
FE — разделитель групп контактов.
FF FC — контакты закончились.
1C — максимальный номер цепи.
DE — номер кабеля.
C6 — crc8.
В примере приведено описание конфигурации для кабеля DB-9F – DB-9M, один в один, без первого контакта, подключаемого к разъёмам Х11, Х5. Между двумя разделителями FE или между FE и FF записываются в шестнадцатиричном коде все номера цепей, перечисленных в первом столбце таблицы и объединяемых проверяемым кабелем. Количество номеров цепей в одной группе должно быть два или более, несвязанные цепи перечислять не имеет смысла. Группы контактов удобнее перечислять с наименьшего используемого номера. Два
разделителя FF и FC заканчивают перечисление. Максимальный номер цепи, в принципе, введён для сокращения времени проверки. Номер кабеля задаёт утверждённый или условный номер кабеля для идентификации. Контрольная сумма CRC8 обеспечивает контроль достоверности приёма данных. Подсчёт контрольной суммы можно произвести с помощью программы crc8.exe.
При загрузке конфигурации кабеля из файла используются файлы с расширением .cbl, которые получают из текстового файла описания с помощью программы cable.exe. Ниже приведён текст файла описания кабеля К-222 cab_222.txt :
* 2 21 * 3 22 * 4 23 * 5 24 * 6 25 * 7 26 * 8 27 * 19 28 & 28 222
Описание должно начинаться с разделителя групп контактов *. Описание последней группы контактов должно оканчиваться разделителем & с последующими максимальным номером цепи и номером кабеля, который не может быть больше 255. Программа cable.exe запускается с параметром имени соответствующего текстового файла: cable.exe cab_222.txt.
В случае отсутствия ошибок в текстовом файле генерируется файл с расширением .cbl, для данного примера — cab_222.cbl, с содержимым, приведённым в примере для строки “Сообщения”. Программа cable.exe скомпилирована под DOS, поэтому допускает длину имени файла не более 8 символов (в дальнейшем файл с расширением .cbl можно переименовать), но работает в окне файлового менеджера FAR под Windows XP. При успешном выполнении программы выводится сообщение “Загрузочный файл описания кабеля сгенерирован”, иначе – сообщение об обнаруженной ошибке. В окно “Принято” программы “COM Port Toolkit” выводится приглашение “Загрузите кабель”, если не выбран ни один из резидентных кабелей, или сразу после включения питания стенда с закороченными контактами цепь 1 – цепь 3 (тумблер “ЗАГРУЗКА” “УСТРОЙСТВА ВЫБОРА” в положении “ВКЛ”), после чего можно загрузить описание кабеля, кликнув по клавише “Send”.
Подключение стенда к компьютеру производится кабелем К-222 через разъём “COM”.
Схема стенда
Устройство выбора
Программа для контроллера на C
#include <reg52.h>
#include <stdio.h>
sbit P0_0 = P0^0;
sbit P0_1 = P0^1;
sbit P0_2 = P0^2;
sbit P0_3 = P0^3;
sbit P0_4 = P0^4;
sbit P0_5 = P0^5;
sbit P0_6 = P0^6;
sbit P0_7 = P0^7;
sbit P1_0 = P1^0;
sbit P1_1 = P1^1;
sbit P1_2 = P1^2;
sbit P1_3 = P1^3;
sbit P1_4 = P1^4;
sbit P1_5 = P1^5;
sbit P1_6 = P1^6;
sbit P1_7 = P1^7;
sbit P2_0 = P2^0;
sbit P2_1 = P2^1;
sbit P2_2 = P2^2;
sbit P2_3 = P2^3;
sbit P2_4 = P2^4;
sbit P2_5 = P2^5;
sbit P2_6 = P2^6;
sbit P2_7 = P2^7;
sbit P3_0 = P3^0;
sbit P3_1 = P3^1;
sbit P3_2 = P3^2;
sbit P3_3 = P3^3;
sbit P3_4 = P3^4;
sbit P3_5 = P3^5;
sbit P3_6 = P3^6;
sbit P3_7 = P3^7;
bit pin0(char io) {if (io==0) P1_0=0 ; else P1_0=1; return P1_0;}
bit pin1(char io) {if (io==0) P1_1=0 ; else P1_1=1; return P1_1;}
bit pin2(char io) {if (io==0) P1_2=0 ; else P1_2=1; return P1_2;}
bit pin3(char io) {if (io==0) P1_3=0 ; else P1_3=1; return P1_3;}
bit pin4(char io) {if (io==0) P1_4=0 ; else P1_4=1; return P1_4;}
bit pin5(char io) {if (io==0) P1_5=0 ; else P1_5=1; return P1_5;}
bit pin6(char io) {if (io==0) P1_6=0 ; else P1_6=1; return P1_6;}
bit pin7(char io) {if (io==0) P1_7=0 ; else P1_7=1; return P1_7;}
bit pin8(char io) {if (io==0) P2_7=0 ; else P2_7=1; return P2_7;}
bit pin9(char io) {if (io==0) P2_6=0 ; else P2_6=1; return P2_6;}
bit pin10(char io) {if (io==0) P2_5=0 ; else P2_5=1; return P2_5;}
bit pin11(char io) {if (io==0) P2_4=0 ; else P2_4=1; return P2_4;}
bit pin12(char io) {if (io==0) P2_3=0 ; else P2_3=1; return P2_3;}
bit pin13(char io) {if (io==0) P2_2=0 ; else P2_2=1; return P2_2;}
bit pin14(char io) {if (io==0) P2_1=0 ; else P2_1=1; return P2_1;}
bit pin15(char io) {if (io==0) P2_0=0 ; else P2_0=1; return P2_0;}
bit pin16(char io) {if (io==0) P3_2=0 ; else P3_2=1; return P3_2;}
bit pin17(char io) {if (io==0) P3_3=0 ; else P3_3=1; return P3_3;}
bit pin18(char io) {if (io==0) P3_4=0 ; else P3_4=1; return P3_4;}
bit pin19(char io) {if (io==0) P3_5=0 ; else P3_5=1; return P3_5;}
bit pin20(char io) {if (io==0) P3_6=0 ; else P3_6=1; return P3_6;}
bit pin21(char io) {if (io==0) P3_7=0 ; else P3_7=1; return P3_7;}
bit pin22(char io) {if (io==0) P0_0=0 ; else P0_0=1; return P0_0;}
bit pin23(char io) {if (io==0) P0_1=0 ; else P0_1=1; return P0_1;}
bit pin24(char io) {if (io==0) P0_2=0 ; else P0_2=1; return P0_2;}
bit pin25(char io) {if (io==0) P0_3=0 ; else P0_3=1; return P0_3;}
bit pin26(char io) {if (io==0) P0_4=0 ; else P0_4=1; return P0_4;}
bit pin27(char io) {if (io==0) P0_5=0 ; else P0_5=1; return P0_5;}
bit pin28(char io) {if (io==0) P0_6=0 ; else P0_6=1; return P0_6;}
bit pin29(char io) {if (io==0) P0_7=0 ; else P0_7=1; return P0_7;}
code bit (code *arpin[])(char)={pin0, pin1, pin2, pin3, pin4, pin5, pin6, pin7,
pin8, pin9, pin10, pin11, pin12, pin13, pin14,
pin15, pin16, pin17, pin18, pin19, pin20, pin21,
pin22, pin23, pin24,pin25, pin26, pin27, pin28,
pin29};
bit r, r1, brief, second;
bit press0, press1, press2, perf, superf;
data unsigned char io, i, j, k, l, m, n, p, er, song, ctl0;
data unsigned char qu = 19;
data unsigned char cnt3;
data unsigned char task[49];
code unsigned char cab_int[]= {254, 0, 14, 254, 3,12,254,2,11,254,6,13,254,7,15,254,8,16,254,10,17,255,252};
code unsigned char cab_61[]= {254,0,19,254,1,20,254,2,21,254,3,22,254,4,23,254,5,24,254,
6,25,254,7,26,254,8,27,255,252};
code unsigned char cab_53[]= {254,0,8,254,1,9,254,2,10,254,3,11,254,4,12,254,5,13,254,6,14,254,7,15,255,252};
code unsigned char cab_cros[]=
{254,0,8,254,1,9,254,2,14,254,3,11,254,4,12,254,5,15,254,6,10,254,7,13,255,252};
code unsigned char cab_52[]= {254,1,12,254,2,11,254,4,14,255,252};
code unsigned char cab_61m[]= {254,0,10,254,1,11,254,2,12,254,3,13,254,4,14,254,5,15,254,
6,16,254,7,17,254,8,18,255,252};
code unsigned char cab_64[]= {254,11,21,254,12,20,254,14,23,254,16,25,255,252};
code unsigned char cab_66[]= {254,11,20,254,12,21,254,14,23,255,252};
code unsigned char cab_80_4[]= {254,1,7,254,2,8,254,3,9,254,4,10,255,252};
code unsigned char cab_56_2[]= {254,2,8,254,3,9,255,252};
code unsigned char cab_80_2[]= {254,1,7,254,4,10,255,252};
code unsigned char cab_81[]= {254,1,12,254,2,11,254,4,14,255,252};
code unsigned char cab_222[]=
{254,1,20,254,2,21,254,3,22,254,4,23,254,5,24,254,6,25,254,7,26,254,8,27,255,252};
code unsigned char fulltst[]= {254,0,23,254,1,22,254,2,21,254,3,20,254,4,19,254,5,18,254,6,17,254,7,16,254,
8,15,254,9,14,254,10,13,254,11,12,254,24,29,254,25,28,254,26,27,255,252};
code unsigned char blanktst[]= {254,1,1,255,252};
code unsigned char cab_63[]= {254,0,1,6,254,4,5,7,255,252};
code unsigned char cab_79[]= {254,0,15,254,1,16,254,2,17,254,5,20,254,6,7,18,19,255,252};
code unsigned char cab_94[]= {254,11,23,254,12,20,254,14,19,24,254,16,21,254,17,22,255,252};
code unsigned char ukrpdu[]= {254,9,13,254,10,15,254,11,18,254,12,14,16,17,255,252};
code unsigned char cab_65[]= {254,0,15,254,1,13,254,5,18,20,254,6,7,14,16,17,19,255,252};
code unsigned char cab_104[]= {254,0,22,254,1,27,254,2,25,254,6,23,255,252};
code unsigned char cab_119[]= {254,1,10,254,2,11,254,5,12,255,252};
code unsigned char cab_120a[]= {254,0,3,254,1,4,254,2,3,255,252};
code unsigned char cab_120b[]= {254,1,4,255,252};
code unsigned char cab_132[]= {254,0,4,254,1,5,254,2,6,254,3,7,255,252};
code unsigned char cab_134[]= {254,1,19,254,2,22,254,3,20,254,4,23,255,252};
/* i - последовательно подаём "0" на все пины до qu-1 (т.к. с нуля) */
/* j - последовательно для всех оставшихся пинов каждый раз выполняем ... */
/* k - проверку: есть ли в этой группе контактный пин ? */
/* l - текущее значение */
/* r - ожидаемое по заданию значение пина */
/* r1 - считанное значение пина: 1 - не соединён, 0 - соединён */
/* qu - максимальный номер цепи, используемый для проверки */
#include "Muson_52.c"
data unsigned char T1Reload;
data unsigned char Play;
data unsigned char melody_index, CNT0;
data unsigned int lang = 0, cnt1, numok;
//*************************************************************************
void timer0(void) interrupt 1 //for music
{
TL0 = ctl0;
CNT0++;
if (!CNT0)
{
if (T1Reload != Silence && Play)
{
// Смена полярности выхода
P0_7 = !P0_7 ;
}
else
{
P0_7 = 1;
}
CNT0 = T1Reload;
}
}
//************************************************************************
void timer1(void) interrupt 3 //for button
{
TH0 = 256 - 230; // 250 uS
if (!perf)
{if (press0)
{if (press1 && P0_6 && !press2) {press2=1; cnt1=1000;}
else if (!cnt1)
{cnt1=1000; if (cnt3) cnt3--;
if (press2)
{press0 = 0; press1 = 0; press2 = 0;
if (cnt3) {perf = 1; superf = 0;} else superf=1;
}
else if (!press1) press1=1;
}
else cnt1--;
}
else if (!P0_6) {press0=1; cnt1=1000; cnt3=5;}
}
}
//*************************************************************************
void delay(unsigned long ticks)
{
while(ticks--);
}
//*************************************************************************
void dj(void)
{ /* "Джентельмены у Дачи" */
melody_index = 0;
while (melody_index <= (brief?8:34))
{ T1Reload = Djen[melody_index][0];
lang = Djen[melody_index][1];
/* Цикл ожидания пока выводится текущая нота */
while (lang)
{
delay(312);
lang--;
}
if (perf || (superf && P0_6)) {Play = 0; break;}
melody_index++;
/* Пауза, чтобы не было щелчков */
T1Reload = Silence;
delay(156);
}
}
//*************************************************************************
void offrom(void)
{ /* "Служебный роман" */
melody_index = 0;
while (melody_index <= (brief?7:44))
{ T1Reload = Roman[melody_index][0];
lang = Roman[melody_index][1];
while (lang)
{
delay(312);
lang--;
}
if (perf || (superf && P0_6)) {Play = 0; break;}
melody_index++;
T1Reload = Silence;
delay(156);
}
}
//*************************************************************************
void leaf(void)
{ /* "Листья" */
melody_index = 0;
while (melody_index <= (brief?6:50))
{ T1Reload = List[melody_index][0];
lang = List[melody_index][1];
while (lang)
{
delay(312);
lang--;
}
if (perf || superf) {Play = 0; break;}
melody_index++;
T1Reload = Silence;
delay(156);
}
}
//*************************************************************************
void vabank(void)
{ /* "Ва Банк" */
melody_index = 0;
while (melody_index <= (brief?12:43))
{ T1Reload = Bank[melody_index][0];
lang = Bank[melody_index][1];
while (lang)
{
delay(312);
lang--;
}
if (perf || superf) {Play = 0; break;}
melody_index++;
T1Reload = Silence;
delay(156);
}
}
//*************************************************************************
void bum(void)
{ /* "Бумер" */
melody_index = 0;
while (melody_index <= (brief?6:35))
{ T1Reload = Bumer[melody_index][0];
lang = Bumer[melody_index][1];
while (lang)
{
delay(312);
lang--;
}
if (perf || superf) {Play = 0; break;}
melody_index++;
T1Reload = Silence;
delay(156);
}
}
//*************************************************************************
void mur(void)
{ /* "Мура" */
melody_index = 0;
while (melody_index <= MURA_LAENGE)
{ T1Reload = Mura[melody_index][0];
lang = Mura[melody_index][1];
while (lang)
{
delay(312);
lang--;
}
melody_index++;
T1Reload = Silence;
delay(156);
}
}
//*************************************************************************
void main(void)
{
for (i = 0; i < 49; i++) task[i] = 0;
n = 0;
ctl0 = 243;
TMOD = 0x23;
TH1 = 0xFD;
PCON ^= 0x80; //0x0D0H for AT89C51
SCON = 0x50;
Play = 1;
ET0 = 1;
ET1 = 1;
TR0 = 1;
TR1 = 1;
EA = 1;
cnt1=1000;
cnt3=5;
p = 0;
qu = 30;
song = 0;
second = 1;
numok = 1;
arpin[0](0);
if (arpin[4](1)) brief=0; else brief=1;
if (!arpin[1](1)) second=0;
if (!arpin[3](1)) // выбор
{
//perf=1;
second=1;
if (!arpin[8](1)) {song=0; perf=1;}
if (!arpin[9](1)) {song=1; perf=1;}
if (!arpin[10](1)) {song=2; perf=1;}
if (!arpin[11](1)) {song=3; perf=1;}
if (!arpin[12](1)) {song=4; perf=1;}
if (!perf)
{
second=0;
if (!arpin[13](1)) {song=0; perf=1;}
if (!arpin[14](1)) {song=1; perf=1;}
if (!arpin[15](1)) {song=2; perf=1;}
if (!arpin[16](1)) {song=3; perf=1;}
if (!arpin[17](1)) {song=4; perf=1;}
}
}
if (arpin[2](1) && arpin[3](1))
{
song = 0;
dj();
delay(10000);
if (!perf)
{song = 1;
offrom();
delay(10000);
if (!perf)
{song = 2;
leaf();
delay(10000);
if (!perf)
{song = 3;
vabank();
delay(10000);
if (!perf)
{song = 4;
bum();
delay(10000);
}
}
}
}
}
TI = 1;
delay(1000);
if (perf)
if (arpin[6](1)) // +20
{
if (arpin[5](1)) // +10
if (second)
switch (song)
{case 0:
for (i = 0; cab_int[i] != 252; i++) task[i] = cab_int[i];
printf ("Кабель интерфейсный"); delay(1000); qu = 19;
break;
case 1:
for (i = 0; cab_61[i] != 252; i++) task[i] = cab_61[i];
printf ("Кабель 61"); delay(1000); qu = 28;
break;
case 2:
for (i = 0; cab_53[i] != 252; i++) task[i] = cab_53[i];
printf ("Кабель 53(57)"); delay(1000); qu = 16;
break;
case 3:
for (i = 0; cab_cros[i] != 252; i++) task[i] = cab_cros[i];
printf ("Crossover"); delay(1000); qu = 16;
break;
case 4:
for (i = 0; cab_52[i] != 252; i++) task[i] = cab_52[i];
printf ("Кабель 52"); delay(1000); qu = 19;
}
else
switch (song)
{case 0:
for (i = 0; cab_61m[i] != 252; i++) task[i] = cab_61m[i];
printf ("Кабель 61М"); delay(1000); qu = 19;
break;
case 1:
for (i = 0; cab_64[i] != 252; i++) task[i] = cab_64[i];
printf ("Кабель 64(74)"); delay(1000); qu = 28;
break;
case 2:
for (i = 0; cab_66[i] != 252; i++) task[i] = cab_66[i];
printf ("Кабель 66"); delay(1000); qu = 28;
break;
case 3:
for (i = 0; cab_80_4[i] != 252; i++) task[i] = cab_80_4[i];
printf ("Кабель 56(58,80) 4-жил."); delay(1000); qu = 12;
break;
case 4:
for (i = 0; cab_56_2[i] != 252; i++) task[i] = cab_56_2[i];
printf ("Кабель 56(58) 2-жил."); delay(1000); qu = 12;
}
else
if (second)
switch (song)
{case 0:
for (i = 0; cab_80_2[i] != 252; i++) task[i] = cab_80_2[i];
printf ("Кабель 80 2-жил."); delay(1000); qu = 12;
break;
case 1:
for (i = 0; cab_81[i] != 252; i++) task[i] = cab_81[i];
printf ("Кабель 81"); delay(1000); qu = 19;
break;
case 2:
for (i = 0; cab_222[i] != 252; i++) task[i] = cab_222[i];
printf ("Кабель 222"); delay(1000); qu = 28;
break;
case 3:
for (i = 0; fulltst[i] != 252; i++) task[i] = fulltst[i];
printf ("Тест на замыкание контактов"); delay(1000); qu = 30;
break;
case 4:
for (i = 0; blanktst[i] != 252; i++) task[i] = blanktst[i];
printf ("Тест на отсутствие замыканий контактов"); delay(1000); qu = 30;
}
else
switch (song)
{case 0:
for (i = 0; cab_63[i] != 252; i++) task[i] = cab_63[i];
printf ("Кабель 63"); delay(1000); qu = 10;
break;
case 1:
for (i = 0; cab_79[i] != 252; i++) task[i] = cab_79[i];
printf ("Кабель 79"); delay(1000); qu = 25;
break;
case 2:
for (i = 0; cab_94[i] != 252; i++) task[i] = cab_94[i];
printf ("Кабель 94"); delay(1000); qu = 30;
break;
case 3:
for (i = 0; ukrpdu[i] != 252; i++) task[i] = ukrpdu[i];
printf ("Устройство коммутационное РПДУ"); delay(1000); qu = 30;
break;
case 4:
for (i = 0; cab_65[i] != 252; i++) task[i] = cab_65[i];
printf ("Кабель 065"); delay(1000); qu = 30;
}
}
else // вторая двадцатка
{
if (arpin[5](1)) // +10
if (second)
switch (song)
{case 0:
for (i = 0; cab_104[i] != 252; i++) task[i] = cab_104[i];
printf ("Кабель 104"); delay(1000); qu = 30;
break;
case 1:
for (i = 0; cab_119[i] != 252; i++) task[i] = cab_119[i];
printf ("Кабель 119"); delay(1000); qu = 14;
break;
case 2:
for (i = 0; cab_120a[i] != 252; i++) task[i] = cab_120a[i];
printf ("Кабель 120 (X1 -> X2)"); delay(1000); qu = 7;
break;
case 3:
for (i = 0; cab_120b[i] != 252; i++) task[i] = cab_120b[i];
printf ("Кабель 120 (X2 -> X1)"); delay(1000); qu = 7;
break;
case 4:
for (i = 0; cab_132[i] != 252; i++) task[i] = cab_132[i];
printf ("Кабель 132"); delay(1000); qu = 19;
}
else
switch (song)
{case 0:
for (i = 0; cab_134[i] != 252; i++) task[i] = cab_134[i];
printf ("Кабель 134"); delay(1000); qu = 25;
break;
case 1:
for (i = 0; cab_64[i] != 252; i++) task[i] = cab_64[i];
printf ("Кабель 64(74)"); delay(1000); qu = 28;
break;
case 2:
for (i = 0; cab_66[i] != 252; i++) task[i] = cab_66[i];
printf ("Кабель 66"); delay(1000); qu = 28;
break;
case 3:
for (i = 0; cab_80_4[i] != 252; i++) task[i] = cab_80_4[i];
printf ("Кабель 56(58,80) 4-жил."); delay(1000); qu = 12;
break;
case 4:
for (i = 0; cab_56_2[i] != 252; i++) task[i] = cab_56_2[i];
printf ("Кабель 56(58) 2-жил."); delay(1000); qu = 12;
}
else
if (second)
switch (song)
{case 0:
for (i = 0; cab_80_2[i] != 252; i++) task[i] = cab_80_2[i];
printf ("Кабель 80 2-жил."); delay(1000); qu = 12;
break;
case 1:
for (i = 0; cab_81[i] != 252; i++) task[i] = cab_81[i];
printf ("Кабель 81"); delay(1000); qu = 19;
break;
case 2:
for (i = 0; cab_222[i] != 252; i++) task[i] = cab_222[i];
printf ("Кабель 222"); delay(1000); qu = 28;
break;
case 3:
for (i = 0; fulltst[i] != 252; i++) task[i] = fulltst[i];
printf ("Тест на замыкание контактов"); delay(1000); qu = 30;
break;
case 4:
for (i = 0; blanktst[i] != 252; i++) task[i] = blanktst[i];
printf ("Тест на отсутствие замыканий контактов"); delay(1000); qu = 30;
}
else
switch (song)
{case 0:
for (i = 0; cab_63[i] != 252; i++) task[i] = cab_63[i];
printf ("Кабель 63"); delay(1000); qu = 10;
break;
case 1:
for (i = 0; cab_79[i] != 252; i++) task[i] = cab_79[i];
printf ("Кабель 79"); delay(1000); qu = 25;
break;
case 2:
for (i = 0; cab_94[i] != 252; i++) task[i] = cab_94[i];
printf ("Кабель 94"); delay(1000); qu = 30;
break;
case 3:
for (i = 0; ukrpdu[i] != 252; i++) task[i] = ukrpdu[i];
printf ("Устройство коммутационное РПДУ"); delay(1000); qu = 30;
break;
case 4:
for (i = 0; cab_65[i] != 252; i++) task[i] = cab_65[i];
printf ("Кабель 065"); delay(1000); qu = 30;
}
}
else
while (p == 0)
{
printf ("Загрузите кабель"); delay(1000);
while ((task[0] = _getkey()) != 254);
for (i = 1; (task[i] = _getkey()) != 252; i++);
i++;
task[i] = _getkey(); qu = task[i]; //максимальное количество пинов
i++;
task[i] = _getkey(); //Номер кабеля
i++;
task[i] = _getkey(); //CRC8
printf ("Количество пинов=%bu", qu); delay(1000);
l = 0;
//счётчик CRC8
for (j = 0; j < i+1; j++)
{
m = task[j];
for (k = 0; k < 8; k++)
{
if ((m ^ l) & 1) {l ^= 0x18; l >>= 1; l |= 0x80;}
else l >>= 1;
m >>= 1;
}
}
if (!l) {printf ("Кабель №%bu загружен", task[i-1]);
p = 1; delay(1000);
for (i = 0; task[i] != 252; i++) if (task[i] < 220) task[i]--;
}
else {printf ("Ошибка CRC8"); delay(1000);}
}
press0 = 0;
press1 = 0;
press2 = 0;
perf = 0;
superf = 0;
arpin[0](1);
while (1){
if (perf || superf)
{ET1 = 0;
for (i=0; i<qu; i++)
{arpin[i](0); delay(250);
for (j=i+1; j<qu; j++) //добавлено =q !!!убрано
{ r=1;
for (k=0; ((task[k] != 255)&&(task[k]!=i)); k++);
if (task[k]==i)
{for (l=k; task[l]<254; l++) if (task[l]==j) r=0;
for (l=k; task[l]<254; l--) if (task[l]==j) r=0;};
r1 = arpin[j](1); /* считываем значение пина */
if (r==0 && r1==1)
{printf ("Отсутствует соединение %bu-%bu", i+1, j+1); er++; delay(1000);};
if (r==1 && r1==0)
{printf ("Лишнее соединение %bu-%bu", i+1, j+1); er++; delay(1000);};
}
arpin[i](1);
}
P0 = 0xff;
P1 = 0xff;
P2 = 0xff;
P3 = 0xff;
Play = 1;
perf = 0;
ET1 = 1;
if (er) {er = 0; ctl0 = 210; mur(); ctl0 = 243;}
else if (Play)
{ printf ("OK %u", numok++);
switch (song)
{case 0: dj();
break;
case 1: offrom();
break;
case 2: leaf();
break;
case 3: vabank();
break;
case 4: bum();}
}
Play = 0;
delay(1000);
}
delay(1000);
}
}
Файл музыки собственно является библиотечным (не помню где взятым из интернета, исполнение оттуда же), но у меня include «Muson_52.c».
MURA_LAENGE 3 — эту «музыку» я сочинил сам
#define CEL 32 // 1/1
#define SEM 16 // 1/2
#define QV 8 // 1/4
#define D_Cr 6 // 3/16
#define Cr 4 // 1/8
#define Qu 2 // 1/16
#define SQ 1 // 1/32
#define C1 17 // 262 -> До
#define Cis1 31 // 278 -> До Диез
#define D1 43 // 294 -> Ре
#define MG4 50
#define Dis1 56 // 312 -> Ре Диез
#define E1 67 // 330 -> Ми
#define F1 77 // 350 -> Фа
#define Fis1 87 // 370 -> Фа Диез
#define G1 97 // 392 -> Соль
#define Gis1 106 // 416 -> Соль Диез
#define A1 114 // 440 -> Ля
#define Ais1 122 // 467 -> Ля Диез
#define H1 130 // 495 -> Си
#define C2 137 // 523 -> До
#define Cis2 143 // 554 -> До Диез
#define D2 150 // 588 -> Ре
#define Dis2 156 // 623 -> Ре Диез
#define E2 161 // 660 -> Ми
#define F2 167 // 699 -> Фа
#define Fis2 171 // 741 -> Фа Диез
#define G2 176 // 785 -> Соль
#define Gis2 180 // 830 -> Соль Диез
#define A2 184 // 880 -> Ля
#define H2 192 // 988 -> Си
#define C3 196 // 1048 -> До
#define Cis3 199 // 1112 -> До Диез
#define D3 202 // 1176 -> Ре
#define Dis3 204 // 1248 -> Ре Диез
#define E3 207 // 1320 -> Ми
#define F3 210 // 1400 -> Фа
#define Fis3 213 // 1480 -> Фа Диез
#define Silence 0
/* "Бумер" */
#define BUMER_LAENGE 35
extern code const char Bumer [BUMER_LAENGE][2] =
{
{ Silence, SQ },
{ E2, Cr },
{ G2, QV },
{ Silence, SEM },
{ G2, Cr },
{ E2, QV },
{ Silence, SEM },
{ A2, Cr },
{ G2, Cr },
{ A2, Cr },
{ G2, Cr },
{ A2, Cr },
{ G2, Cr },
{ A2, Cr },
{ G2, Cr },
{ A2, Cr },
{ H2, QV },
{ Silence, SEM },
{ E2, Cr },
{ G2, QV },
{ Silence, SEM },
{ G2, Cr },
{ E2, QV },
{ Silence, SEM },
{ A2, Cr },
{ G2, Cr },
{ A2, Cr },
{ G2, Cr },
{ A2, Cr },
{ G2, Cr },
{ A2, Cr },
{ G2, Cr },
{ A2, Cr },
{ H2, QV },
{ Silence, SQ }
};
/* "Листья" */
#define LIST_LAENGE 50
extern code const char List [LIST_LAENGE][2] =
{
{ Silence, SQ },
{ A2, QV },
{ H2, QV },
{ C3, QV },
{ H2, D_Cr },
{ A2, SEM },
{ E2, 3 },
{ C3, QV },
{ H2, D_Cr },
{ A2, QV },
{ E2, QV },
{ G2, SEM },
{ F2, CEL },
{ H1, QV },
{ C2, QV },
{ E2, QV },
{ D2, D_Cr },
{ H1, SEM },
{ E1, 3 },
{ E2, QV },
{ D2, D_Cr },
{ C2, QV },
{ Gis1, 12 },
{ H1, SEM },
{ A1, CEL },
{ A2, QV },
{ H2, QV },
{ C3, QV },
{ H2, D_Cr },
{ A2, SEM },
{ E2, 3 },
{ C3, D_Cr },
{ H2, QV },
{ A2, QV },
{ E2, 12 },
{ G2, SEM },
{ F2, CEL },
{ H1, QV },
{ C2, QV },
{ E2, QV },
{ D2, D_Cr },
{ H1, SEM },
{ E1, 3 },
{ E2, QV },
{ D2, QV },
{ C2, QV },
{ Gis1, QV },
{ H1, SEM },
{ A1, CEL },
{ Silence, Qu }
};
/* "Служебный роман" */
#define ROMAN_LAENGE 44
extern code const char Roman [ROMAN_LAENGE][2] =
{
{ Silence, SQ },
{ C2, Cr },
{ F2, Cr },
{ G2, Cr },
{ Gis2, Cr },
{ G2, Cr },
{ G2, Cr },
{ F2, Cr },
{ F2, Cr },
{ E2, Cr },
{ D2, Cr },
{ E2, Cr },
{ F2, QV },
{ Silence, 12 },
{ C2, Cr },
{ Cis2, Cr },
{ C2, Cr },
{ Ais1, QV },
{ Silence, 12 },
{ F2, Cr },
{ G2, Cr },
{ F2, Cr },
{ E2, QV },
{ Silence, 12 },
{ C2, Cr },
{ F2, Cr },
{ G2, Cr },
{ Gis2, Cr },
{ G2, Cr },
{ G2, Cr },
{ F2, Cr },
{ F2, Cr },
{ E2, Cr },
{ D2, Cr },
{ E2, Cr },
{ F2, QV },
{ Silence, 12 },
{ F2, Cr },
{ G2, Cr },
{ Gis2, Cr },
{ G2, SEM },
{ F2, QV },
{ G2, QV },
{ Silence, SQ }
};
/* "Ва Банк" */
#define BANK_LAENGE 43
extern code const char Bank [BANK_LAENGE][2] =
{
{ Silence, SQ },
{ F2, Cr },
{ D2, Qu },
{ Silence, Cr },
{ A1, Cr },
{ Silence, Qu },
{ F2, Qu },
{ D2, Cr },
{ A1, Qu },
{ F2, Cr },
{ D2, Qu },
{ Silence, Cr },
{ A1, Cr },
{ Silence, Qu },
{ F2, Qu },
{ E2, Cr },
{ D2, Qu },
{ F2, Cr },
{ E2, Qu },
{ Silence, Cr },
{ Gis1, SEM },
{ Silence, QV },
{ F2, Cr },
{ E2, Qu },
{ Silence, Cr },
{ G1, Cr },
{ Silence, Qu },
{ F2, Qu },
{ E2, Cr },
{ G1, Qu },
{ F2, Cr },
{ E2, Qu },
{ Silence, Cr },
{ G1, Cr },
{ Silence, Qu },
{ F2, Qu },
{ E2, Cr },
{ G1, Qu },
{ E2, Cr },
{ D2, Qu },
{ Silence, Cr },
{ A2, SEM },
{ Silence, SQ }
};
/* "Джентельмены удачи" */
#define DJEN_LAENGE 34
extern code const char Djen [DJEN_LAENGE][2] =
{
{ Silence, SQ },
{ E2, Cr },
{ F2, Cr },
{ Silence, Qu },
{ E2, Qu },
{ Dis2, Qu },
{ E2, Qu },
{ Silence, Qu },
{ C2, QV },
{ Silence, QV },
{ E2, Cr },
{ F2, Cr },
{ Silence, Qu },
{ E2, Qu },
{ Dis2, Qu },
{ E2, Qu },
{ Silence, Qu },
{ H1, QV },
{ Silence, QV },
{ E2, Cr },
{ C3, Cr },
{ H2, Cr },
{ A2, Cr },
{ E2, Cr },
{ G2, Cr },
{ Silence, Qu },
{ F2, Qu },
{ E2, Cr },
{ F2, Cr },
{ E2, Qu },
{ F2, Qu },
{ E2, Qu },
{ D2, SEM },
{ Silence, Qu }
//{ Silence, Qu }
};
#define MURA_LAENGE 3
extern code const char Mura [MURA_LAENGE][2] =
{
{ Silence, SQ },
{ 2, 80 },
{ Silence, SQ }
};
extern code const char ee [1][2] =
{
{ Silence, SQ }};
Программа для компьютера на C++ , чтобы создать файл загрузки с расширением .cbl
#include <stdio.h>
#include <stdlib.h>
#include <dir.h>
main (int argc, char* argv[])
{
FILE* f1;
unsigned char buf[49], bufout[100], bu[10];
unsigned char c, i, j, k, l, m, n;
char drive[3], dir[66], name[9], ext[5];
for (i = 0; i < 49; i++)
buf[i] = 0;
for (i = 0; i < 100; i++)
bufout[i] = 0;
if (argc != 2) {printf("Употребление: cable.exe имя_файла.txt\n"); return 1;}
char* namef = argv[1];
f1 = fopen(namef, "rt");
if (!f1) {printf("Ошибка открытия файла %s\n", namef); return 1;}
if ((c=fgetc(f1)) != '*')
{printf("Файл должен начинаться с *\n"); return 1;}
else buf[0] = 254;
i = 1; j = 1; n = 0;
while (((c = fgetc(f1)) != '&') & ((char)c != EOF))
{
if (i > 48) {printf("Превышение длины файла\n"); return 1;}
if (c == '*')
if (j == 1) {printf("Ошибка: пустая группа\n"); return 1;}
else {j = 1;
if (n) { bu[n] = 0; n = 0; j = 0; buf[i++] = (char)atoi(bu);}
buf[i++] = 254;
}
if (c == 32)
if (n) {bu[n] = 0; n = 0; j = 0; buf[i++] = (char)atoi(bu);}
if ((c != '*') & (c != 32))
{
if ((c > 47) & (c < 58 ))
{bu[n++] = c; j = 0; k = 0;}
else {printf("Ошибка: недопустимый символ\n"); return 1;}
}
}
if ((char)c == EOF) {printf("Отсутствует разделитель &\n"); return 1;}
else
{
if (n) {bu[n] = 0; n = 0; j = 0; buf[i++] = (char)atoi(bu); k = 0;}
buf[i++] = 255; buf[i++] = 252;
}
l = 0;
while (l < 2)
{
c = fgetc(f1);
if (i > 48) {printf("Превышение длины файла\n"); return 1;}
if ((c == 32) | ((char)c == EOF))
if (n) {bu[n] = 0; n = 0; buf[i] = (char)atoi(bu);
if ((buf[i++] > 30) & (l == 0))
{printf("Максимальное количество контактов не больше 30\n"); return 1;}
l++;
}
if ((c != 32) & ((char)c != EOF))
{
if ((c > 47) & (c < 58 ))
bu[n++] = c;
else {printf("Ошибка: недопустимый символ после &\n"); return 1;}
}
if ((l == 1) & ((char)c == EOF))
{printf("Отсутствует номер кабеля\n"); return 1;}
if ((l == 0) & ((char)c == EOF))
{printf("Отсутствуют количество контактов и номер кабеля\n"); return 1;}
}
//if (l != 2) {printf("Отсутствует номер кабеля\n"); return 1;}
if (fclose(f1)) {printf("Ошибка закрытия файла %s\n", namef); return 1;}
l = 0;
for (j = 0; j < i; j++)
{
m = buf[j];
for (k = 0; k < 8; k++)
{
if ((m ^ l) & 1) {l ^= 0x18; l >>= 1; l |= 0x80;}
else l >>= 1;
m >>= 1;
}
}
buf[i] = l;
k = 0;
for (j = 0; j < i + 1; j++)
{
if ((buf[j] < 252) & (buf[j] > 30) & (j < (i - 1)))
{printf("Номер цепи должен быть не больше 30\n"); return 1;}
bufout[k++] = buf[j]; //bufout[k++] = 32;
}
bufout[k] = 253;
fnsplit(namef, drive, dir, name, ext);
fnmerge(namef, drive, dir, name, "cbl");
f1 = fopen(namef, "wt");
for (j = 0; bufout[j] != 253; j++)
if (fprintf(f1, "%02X ", bufout[j]) != EOF);
else {printf("Ошибка записи в файл %s\n", namef); return 1;}
if (fclose(f1)) {printf("Ошибка закрытия файла %s\n", namef); return 1;}
printf("Загрузочный файл описания кабеля сгенерирован\n");
return 0;
}