Название: Qt и плата te1-pci2
Отправлено: Naska_igorevna от Март 31, 2022, 19:04
Здравствуйте, есть двухканальная плата te1-pci2 от элкуса, один канал настроен как КК, другой - ОУ. Программа реализует передачу /приём массива данных из одного канала в другой. При условии, когда массив до 32 элементов работа программы корректна, если длина массива больше, приём некорректный, насчитывается именно 33 элемент, а в конце добавляется ноль. Подскажите, пожалуйста, в чем может быть причина. Заранее спасибо. И извините, если ошиблась веткой форума. const short SZ = 32, Base = 1, rtAddr = 0x1B, /*27*/ rtSubAddr = 0x1E; /*30*/ int back[64], OutputMas[64], //awBuf InputMas[64]; //bcBack
int KS, OS, i, tmbNum, ErrorInt; QString OutputStr, // строка для принятия сообщения InputStr, // строка для отправки сообщения MilName; // имя манчестера TTmkEventData tmkEvD; TTmkConfigData tmkCfg; QByteArray str;
int Mysize = 2 * SZ;
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this);
if (TmkOpen()) { ui->StatusLB->addItem("Манчестер НЕ готов к работе"); } else { ui->StatusLB->addItem("Манчестер готов к работе"); } }
MainWindow::~MainWindow() { delete ui; }
void MainWindow::on_pushButton_clicked() //отправить { InputStr = ui->MessageLine->text();
for (i = 0; i < InputStr.size(); i++) { InputMas[i] = InputStr[i].digitValue(); }
for (register int i = 0; i < Mysize; i++) { back[i] = OutputMas[i] = 0; }
if(ui->radioButton->isChecked()) { //Подготовить устройство 0 в режиме КК if(tmkconfig(0) != 0) { ui->StatusLB->addItem("tmkconfig() выполнить не удалось! Плата занята или отсутствует\n"); TmkClose(); } tmkselect(0); tmkgetinfo(&tmkCfg);
ui ->StatusLB->addItem("Имя платы: " + QString::fromLatin1(tmkCfg.szName)); bcreset(); bcdefbase(Base); // Функция настраивает выбранный КК и драйвер на дальнейшую работу с ДОЗУ в указанной базе.
// Подготовить плату 1 в режиме ОУ. if (tmkconfig(1)) { ui->StatusLB->addItem("Ошибка конфигурации mil-1553\n"); } rtreset(); //Функция производит инициализацию выбранного устройства с переводом его в режим ОУ. rtdefaddress(rtAddr);
#if USE_MODE==YES int rtMode = rtgetmode(); if (rtdefmode(rtMode #if FLAG_MODE==YES | RT_FLAG_MODE #endif | RT_HBIT_MODE)) std::cout << "\nThere is an error with rtdefmode.\n"; rtMode = rtgetmode(); #endif
rtdefsubaddr(RT_TRANSMIT, rtSubAddr); rtclrflag(); rtdefsubaddr(RT_RECEIVE, rtSubAddr); rtclrflag();
//{-> Подготовка сообщения. tmkselect(0); KS = CW(rtAddr, RT_RECEIVE, rtSubAddr, InputStr.size()); bcputw(0, KS);
for (i = 0; i<InputStr.size(); i++) bcputw(i + 1, InputMas[i]); delay(2);
//{-> Отправка сообщения.
bcstartx(Base, DATA_BC_RT | CX_CONT | CX_BUS_A | CX_NOSIG); // CX_BUS_A - канал 1 delay(2); if (ErrorInt != 0) { bcstartx(Base, DATA_BC_RT | CX_CONT | CX_BUS_B | CX_NOSIG); } // то переходим на резервный канал CX_BUS_A
tmkgetevd(&tmkEvD); //<-}
ui->StatusLB->addItem("Успешно отправлено: " + InputStr); } }
void MainWindow::on_pushButton_2_clicked() // считать { if(ui->radioButton->isChecked()) { tmkselect(1);
for (i = 0; i < InputStr.size(); i++) { back[i] = rtgetw(i); delay(2); } std::cout<< ""<<std::endl; for (i = 0; i < Mysize; i++) { std::cout<< back[i]<<std::endl;} // до сюда вроде норм
rtdefsubaddr(RT_TRANSMIT, rtSubAddr); std::cout<< "" <<std::endl;
for (i = 0; i < InputStr.size(); i++) rtputw(i, back[i]); delay(2); //Функция записывает слово back[i] в текущий подадрес ДОЗУ выбранного ОУ по адресу i.
//{-> Запрос подготовленного сообщения из ОУ tmkselect(0); KS = CW(rtAddr, RT_TRANSMIT, rtSubAddr, InputStr.size());delay(2); bcputw(0, KS); delay(2);
bcstartx(Base, DATA_RT_BC | CX_STOP | CX_BUS_A | CX_NOSIG); delay(2); // if () //<-}
for (i = 0; i < InputStr.size(); i++) { OutputMas[i] = bcgetw(i + 2); delay(2); std::cout<< OutputMas[i]<<std::endl; }
if (OutputMas == NULL) { ui->StatusLB->addItem("Данные НЕ были считаны с платы!"); }
else { for (i = 0; i < InputStr.size(); i++) { OutputStr += QString::number(OutputMas[i]); } } //считывает правильно с платы, но выводит неправильно
// Вывод результата на экран ui->StatusLB->addItem("Принято: " + OutputStr + " - успешно!");
if (QString::compare(InputStr,OutputStr) != 0) { ui->StatusLB->addItem("Данные считаны НЕ верно: " + InputStr + " != " + OutputStr + " : ОШИБКА!"); } else { ui->StatusLB->addItem("Данные считаны верно! " + InputStr + " = " + OutputStr + " : УСПЕШНО!"); } rtreset(); TmkClose(); if (TmkOpen()) { ui->StatusLB->addItem("Манчестер не завершил работу!"); } ui->StatusLB->addItem("Манчестер завершил работу!"); } }
Название: Re: Qt и плата te1-pci2
Отправлено: qtkoder777 от Март 31, 2022, 23:41
Подскажите, пожалуйста, в чем может быть причина. Заранее спасибо. И извините, если ошиблась веткой форума. for (i = 0; i < InputStr.size(); i++) rtputw(i, back[i]); delay(2); //Функция записывает слово back[i] //в текущий подадрес ДОЗУ
Превысили ДОЗУ! Плата пьянеет и начинает глючить.
Название: Re: Qt и плата te1-pci2
Отправлено: Dimas от Апрель 01, 2022, 08:29
Если это про манчестер, то посмотрите внимательно спецификацию. Размер одного пакета 32 слова. Для передачи следующих слов надо укладывать их на следующий подадрес. ГОСТ Р 52070-2003 Интерфейс магистральный: https://ohranatruda.ru/upload/iblock/5ee/4294816610.pdf (https://ohranatruda.ru/upload/iblock/5ee/4294816610.pdf)
Название: Re: Qt и плата te1-pci2
Отправлено: Naska_igorevna от Апрель 01, 2022, 10:14
Спасибо большое, разобралась :)
|