-
АвторТема
-
13.06.2017 в 10:54 #75353
Здравствуйте,
Куплен ZET 220 №1217. Всё необходимое программное обеспечение куплено.
Нужно написать программу для снятия АЧХ на C#.
Проблема в следующем, не могу выдать сигнал на ЦАП.
Не смог разобраться с физическими и виртуальными каналами ЦАП, в документации не понятно написано.
Написал простую программку генератора, Исходный код предоставлен, весь проект в прикреплённом файле.
Например: Диапазон частот 0.5-100 гц. Амплитуда 0.3-1 вольт. Нужно выдавать синусоиду для определённого ряда фиксированных частот в заданном интервале времени. Например: 10гц — 20 сек, 20 герц — 50 сек, 75 гц — 1 мин и тп.С уважением Владимир В. Кузнецов, ПАО ДНПП.
-
АвторТема
-
АвторОтветы
-
13.06.2017 в 10:54 #75354
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using AxSRVLib;namespace GeneratorCS1
{
public partial class Form1 : Form
{
public double dtime = 0.0;
public double ServerTime = 0.0, MyTime = 0.0;
double PI = Math.PI;
int ChannelDAC = 0; // ЦАП
int VrtChannelDAC = 0; // ЦАП
int iMaxChanDAC; // количество каналов ЦАП
float FreqDisDAC;
int iError;
string str = «»;
double Amplituda = 1.0; // амплитуда сигнала генратора
double Freq = 10.0; // частота сигнала генератора
double interval = 0.1; // интервал генератора
double faza = 0;AxSRV Serv;
public Form1()
{
InitializeComponent();
Serv = new AxSRV();
Serv.Parent = this;
Controls.Add(Serv);
comboBox1.ResetText();
comboBox1.Text = «Генератор»;
comboBox2.ResetText();
comboBox2.Text = «Частота»;
comboBox3.ResetText();
comboBox3.Text = «Амплитуда»;}
// старт генератор синусоиды
private void button1_Click(object sender, EventArgs e)
{
Amplituda = 300; // амплитуда в мВ, 300 -> 0,3 В, 1000 -> 1 В
Freq = 7.50; // частота в герцахChannelDAC = 0;
//iError = Serv.Connect(); // подключится к серверу
iError = Serv.ConnectDac(ChannelDAC); // подключится к серверу
if (iError < 0)
MessageBox.Show(«Ошибка подключения к серверу: » + iError.ToString()); // ошибка ZetLabiError = Serv.GetStatus(ChannelDAC);
if (iError != 1) MessageBox.Show(«Статус канала, не ЦАП: » + iError.ToString()); // ошибка ZetLabiMaxChanDAC = Serv.MaxQuanChanDac(); // максимальное количество каналов ЦАП
iError = Serv.IsFreeChanDac(ChannelDAC); // канал ЦАП свободен?
if (iError != 0)
MessageBox.Show(«Канал ЦАП занят: «+ChannelDAC.ToString() +» : » +iError.ToString());
VrtChannelDAC = Serv.IdChanDac(ChannelDAC, ref iError); // Получить виртуальный канал DAC
if (VrtChannelDAC < 0)
MessageBox.Show(«Ошибка выделения виртуального канала: » + VrtChannelDAC.ToString());iError = Serv.SetChanDac(ChannelDAC); // подключить канал DAC
if (iError != 0) MessageBox.Show(«Ошибка подключения канала: » + iError.ToString());
//iError = Serv.SetChanDac(VrtChannelDAC); // подключить канал DAC// подключить виртуальный канал
//if (iError != 0) MessageBox.Show(«Ошибка подключения канала: » + iError.ToString());str = Serv.Commentary(ChannelDAC);
str = Serv.Commentary(VrtChannelDAC);
iError = Serv.SetAttenuation(ChannelDAC, (float)1.0); // время затухания
if (iError != 0) MessageBox.Show(«Ошибка затухания: » + iError.ToString());
FreqDisDAC = Serv.Frequency(ChannelDAC); // частота дискретизации DAC
if (FreqDisDAC <= 0 || FreqDisDAC > 2000) MessageBox.Show(«Ошибка дискрета: » + iError.ToString());
//DecBufSize = Serv.DecadeBufferSize(0); // размер буфера по декаде 0. от 0 до 4
//i = Serv.BufferSize();MyTime = Serv.CurrentTime(ChannelDAC);
ServerTime = Serv.CurrentTime(ChannelDAC);
interval = 0.50; // секунд
timer2.Interval = 100;
timer2.Enabled = true;
timer2.Start();}
// стоп генератор
private void button2_Click(object sender, EventArgs e)
{
timer2.Enabled = false;
timer2.Stop();
iError = Serv.DisconnectVrtCh();
iError = Serv.DisconnectDac(ChannelDAC);
iError = Serv.Disconnect();
}private void textBox1_TextChanged(object sender, EventArgs e)
{
// частота
}private void textBox2_TextChanged(object sender, EventArgs e)
{
// амплитуда
}// Обработка события от таймера. Запись синусоиды в ЦАП
private void timer2_Tick(object sender, EventArgs e)
{
ServerTime = Serv.CurrentTime(ChannelDAC);
if (MyTime < ServerTime)
{
unsafe
{
int i = 0;
int psize = 1000;
float* pBufDAC = stackalloc float[psize];for (i = 0; i < (int)(FreqDisDAC * interval); i++)
{
pBufDAC[i] = (float)(Math.Sin((double)i / FreqDisDAC * Freq * 2 * PI + faza) * Amplituda); // генерим синус
}
faza = faza + FreqDisDAC * interval / FreqDisDAC * Freq * 2 * PI; //’запоминаем фазу
//long PutDataNet (long lChannel, double dTime, long lSize, long pData)
iError = Serv.PutDataNet(ChannelDAC, (MyTime + 1.0), (int)(FreqDisDAC * interval), (int)pBufDAC); // записать в ЦАП (FreqDisDAC * interval) отсчетов
//iError = Serv.PutDataNet(VrtChannelDAC, (MyTime + 1.0), (int)(FreqDisDAC * interval), (int)pBufDAC); // записать в ЦАП (FreqDisDAC * interval) отсчетов
if (iError != 0)
{
//MessageBox.Show(«Ошибка PutDateNet: » + iError.ToString()); // ошибка ZetLab
//dtime = dtime + 1.0; // отладочный код
}
MyTime = MyTime + interval; // время следующего запуска
iError = axGridGL1.PaintNet((int)pBufDAC); // контрольная картинка, нарисовать график
//if (iError < 0) ErrorZETLAB(iError);
}
//dtime = dtime + 1; // отладочный код
textBox1.Text = MyTime.ToString(); // показать время ЦАП
textBox2.Text = ServerTime.ToString(); // показать время сервера
}
}private void ErrorZETLAB(int iError)
{
str = String.Format(«Ошибка сервера ZETLAB {0}», iError);
MessageBox.Show(str);
//MessageBox.Show(«Проверьте подключение ZET220»);
}}
}13.06.2017 в 10:56 #75355Здравствуйте, Владимир
Рассмотрев поставленную проблему, мы постарались написать простенький проект на C# по передаче данных в генератор ZET220. Прикрепляем его к письму.
Данный проект генерирует синус с частотой 10 Гц и амплитудой 1 В. Код программы привязан к настройкам ZET220, частота ЦАП должна быть 200 кГц.
По нажатию на кнопку «ЗАПУСК» программа начинает генерировать синус, а по нажатию на кнопку «ОСТАНОВКА» перестает это делать.При записи данных в генератор есть важный момент, нужно записывать данные на опережение. Расчет времени опережения приведен в примере.
P.S. Так как пользователей .NET было не так много, советуем обновить файл SRV.ocx на прикрепленный к письму и установить последнюю beta версию ПО ZETLab. С этим файлом генератор гарантированно работает.
С уважением, отдел технической поддержки ООО «ЭТМС»
12.02.2018 в 10:59 #90915Здравствуйте. Возникла похожая задача с этим устройством (zet 220 s/n 1223), необходимо передавать на устройство произвольный сигнал, представленный в цифровом виде, и воспользовавшись ЦАП вашего устройства получать сигнал в аналоге; для разработки используется C#. Есть ли возможность повторно выслать на мой почтовый адрес пример реализации и обновлённую версию программного компонента.
С уважением Юрий, ФГУП ВНИИФТРИ.12.02.2018 в 13:42 #90947Добрый день!
Ответ отправлен Вам на электронную почту. -
АвторОтветы
Для ответа в этой теме необходимо авторизоваться.