• Автор
    Тема
  • #75353

    Владимир
    Участник

    Здравствуйте,

    Куплен ZET 220 №1217. Всё необходимое программное обеспечение куплено.
    Нужно написать программу для снятия АЧХ на C#.
    Проблема в следующем, не могу выдать сигнал на ЦАП.
    Не смог разобраться с физическими и виртуальными каналами ЦАП, в документации не понятно написано.
    Написал простую программку генератора, Исходный код предоставлен, весь проект в прикреплённом файле.
    Например: Диапазон частот 0.5-100 гц. Амплитуда 0.3-1 вольт. Нужно выдавать синусоиду для определённого ряда фиксированных частот в заданном интервале времени. Например: 10гц — 20 сек, 20 герц — 50 сек, 75 гц — 1 мин и тп.

    С уважением Владимир В. Кузнецов, ПАО ДНПП.

Просмотр 2 ответов - с 1 по 2 (всего 2)
  • Автор
    Ответы
  • #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()); // ошибка ZetLab

    iError = Serv.GetStatus(ChannelDAC);
    if (iError != 1) MessageBox.Show(«Статус канала, не ЦАП: » + iError.ToString()); // ошибка ZetLab

    iMaxChanDAC = 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»);
    }

    }
    }

    #75355

    Елена Зимина
    Хранитель

    Здравствуйте, Владимир

    Рассмотрев поставленную проблему, мы постарались написать простенький проект на C# по передаче данных в генератор ZET220. Прикрепляем его к письму.

    Данный проект генерирует синус с частотой 10 Гц и амплитудой 1 В. Код программы привязан к настройкам ZET220, частота ЦАП должна быть 200 кГц.
    По нажатию на кнопку «ЗАПУСК» программа начинает генерировать синус, а по нажатию на кнопку «ОСТАНОВКА» перестает это делать.

    При записи данных в генератор есть важный момент, нужно записывать данные на опережение. Расчет времени опережения приведен в примере.

    P.S. Так как пользователей .NET было не так много, советуем обновить файл SRV.ocx на прикрепленный к письму и установить последнюю beta версию ПО ZETLab. С этим файлом генератор гарантированно работает.

    С уважением, отдел технической поддержки ООО «ЭТМС»

Просмотр 2 ответов - с 1 по 2 (всего 2)

Для ответа в этой теме необходимо авторизоваться.