Создание программы для установления соединения с ПЛК через PVI и другую программу - PullRequest
2 голосов
/ 19 июня 2019

Как видно из названия, мне нужна помощь написание программы, которая будет подключаться к PVI, и другой программы ( Я не уверен, возможно ли установить связь с такой программой, которая была написана исходным изготовителем станка я предоставлю как можно больше подробностей об этом. ) тогда будет обмениваться информацией от ПЛК к работающей программе и позволит зафиксировать кадр этой программы и сделать снимки экрана это так же как разморозить это после .

Я включу код, который у меня есть, который я написал до сих пор, используя учебное руководство, предоставленное B & R, это просто для того, чтобы установить соединение с PVI и программой студии автоматизации, работающей на ПЛК.

Это устаревшее учебное пособие, но это единственный источник информации, который у меня есть для решения этой проблемы. Программа, которую я написал, компилируется и запускается, похоже, что-то вроде соединения с ПЛК, который я подключил к своему ноутбуку, а также при запуске программы моделирования без ПЛК. Однако он не считывает данные из программы, поскольку в учебном руководстве объясняется, что он будет считывать значения некоторых переменных, которые я сделал в студии автоматизации.

Также при попытке нажать на любую из сделанных мной кнопок, и я буду честен, я не уверен на 100%, что они даже должны делать, это даст мне ошибку (System.NullReferenceException: 'Object reference not set to an instance of an object.' myStructPV was null.). Я предполагаю, что пытаюсь сказать мне, что переменная, которая используется при нажатии кнопки, является нулевой, однако эти переменные являются частью пространства имен сервисов PVI, и я не уверен, какое значение вы бы дали им при инициализации.

Я приношу свои извинения, если это не имеет особого смысла, как я уже говорил, я довольно новичок в разработке и не использовал Visual studio или C # с тех пор, как колледж вернулся.

Любой совет или помощь будут оценены очень большое спасибо.

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 BR.AN.PviServices;

namespace PVITestApp
{
    public partial class Form1 : Form
    {
        public Service myService;
        public Cpu myCpu;
        public BR.AN.PviServices.Task myTask;
        public Variable myVariable;
        public Module myModule;
        public Variable myVariablePV1;
        public Variable myStructPV;

        public Form1()
        {


            InitializeComponent();
            // txtStatus.Text = "text box is functioning!";


        }

        private void MyStructPV_Error(object sender, PviEventArgs e)
        {
            throw new NotImplementedException();
        }

        private void MyStructPV_ValueChanged(object sender, VariableEventArgs e)
        {
            throw new NotImplementedException();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            myService = new Service("service");
            myService.Connected += MyService_Connected;
            myService.IsStatic = true;
            myService.Connect();
        }

        private void MyService_Connected(object sender, PviEventArgs e)
        {
            this.txtStatus.Text += "Service Connected\r\n";
            if (myCpu == null)
            {
                myCpu = new Cpu(myService, "cpu");
                //myCpu.Connection.DeviceType = BR.AN.PviServices.DeviceType.TcpIp;
                myCpu.Connection.DeviceType = DeviceType.TcpIp;
                myCpu.Connection.TcpIp.DestinationStation = 2;
                myCpu.Connection.TcpIp.DestinationPort = 11160;
                myCpu.Connection.TcpIp.DestinationIpAddress = "192.168.0.1";

                //myCpu.Connection.TcpIp.DestinationIpAddress = "127.0.0.1";
                myCpu.Connected += MyCpu_Connected;
                myCpu.Error += MyCpu_Error;
                myCpu.Connect(ConnectionType.CreateAndLink);
                // maybe need to use this one - myCpu.Connect(ConnectionType.Create);
            }

           // throw new NotImplementedException();
        }


        private void MyCpu_Error(object sender, PviEventArgs e)
        {
            this.txtStatus.Text += e.Name + " Error:" + e.ErrorCode + "\r\n";
           // throw new NotImplementedException(txtStatus.Text = "Error connecting.");
        }

        private void MyCpu_Connected(object sender, PviEventArgs e)
        {
            this.txtStatus.Text += "CPU Connected\r\n";
            myTask = new BR.AN.PviServices.Task(myCpu, "pvitest");
            myTask.Connected += MyTask_Connected;
            myTask.Error += MyTask_Error;
            myTask.Connect();
            //throw new NotImplementedException();
        }

        private void MyTask_Error(object sender, PviEventArgs e)
        {
            this.txtStatus.Text += e.Name + " Error:" + e.ErrorCode + "\r\n";
            //throw new NotImplementedException();
        }

        private void MyTask_Connected(object sender, PviEventArgs e)
        {
            this.txtStatus.Text += "Task " + e.Name + " Connected\r\n";
            if (myVariable == null)
            {
                myVariable = new Variable(myTask, "Lifesign");
                myVariable.Active = true;
                myVariable.RefreshTime = 200;
                myVariable.ValueChanged += MyVariable_ValueChanged;
                myVariable.Error += MyVariable_Error;
                myVariable.Connect();
            }
            if (myVariablePV1 == null)
            {
                myVariablePV1 = new Variable(myTask, "VarCreateOnly");
                myVariablePV1.Address = "PV1";
                myVariablePV1.Connect(ConnectionType.Create);
            }
           // throw new NotImplementedException();
        }

        private void MyVariable_Error(object sender, PviEventArgs e)
        {
            txtStatus.Text += e.Name + " E#" + e.ErrorCode.ToString();
            //throw new NotImplementedException();
        }

        private void MyVariable_ValueChanged(object sender, VariableEventArgs e)
        {
            if (myStructPV == null) //PG35 stuff may need to move
            {
                myStructPV = new Variable(myTask, "Pv_Struct");
                myStructPV.Active = true;
                myStructPV.RefreshTime = 1000;
                myStructPV.ValueChanged += MyStructPV_ValueChanged;
                myStructPV.Error += MyStructPV_Error;
                myStructPV.Connect();
            }
            // /\ above may need to be moved back.
            if (e.Name == "Lifesign")
            {
                lblValLifesign.Text = ((Variable)sender).Value.ToString();
            }
            if (e.Name == "linkVarPV1")
            {
                lblPV1.Text = ((Variable)sender).Value.ToString();
            }
            Variable tmpVar = (Variable)sender; //PG 36 - 37

            if(e.Name == "Pv_Struct")
            {
                if (tmpVar.Value.DataType == DataType.Structure)
                {
                    foreach (Variable member in tmpVar.Members.Values)
                    {
                        txtStatus.Text += member.Value.ToString() + "\r\n";
                    }
                }
            }
            foreach (String membername in e.ChangedMembers)
            {
                if (membername != null)
                {
                    txtStatus.Text += tmpVar.Value[membername].ToString() + "\r\n";

                }
            }
            //throw new NotImplementedException();
        }

        private void CmdConnectPV1_Click(object sender, EventArgs e)
        {
            Variable myLinkPV1 = new Variable(myVariable, "linkVarPV1");
            myLinkPV1.LinkName = myVariablePV1.FullName;
            myLinkPV1.Active = true;
            myLinkPV1.ValueChanged += MyLinkPV1_ValueChanged;
            myLinkPV1.Error += MyLinkPV1_Error;
            myLinkPV1.Connect(ConnectionType.Link);
        }

        private void MyLinkPV1_Error(object sender, PviEventArgs e)
        {
            //throw new NotImplementedException();
        }

        private void MyLinkPV1_ValueChanged(object sender, VariableEventArgs e)
        {
           // throw new NotImplementedException();
        }

        private void CmdReadVar_Click(object sender, EventArgs e)
        {
            myVariable.ValueRead += MyVariable_ValueRead;
            myVariable.ReadValue();
        }

        private void MyVariable_ValueRead(object sender, PviEventArgs e)
        {
            this.lblReadVar.Text = ((Variable)sender).Value.ToString();
            //throw new NotImplementedException();
        }

        private void CmdReadTime_Click(object sender, EventArgs e)
        {
            myCpu.DateTimeRead += MyCpu_DateTimeRead;
            myCpu.ReadDateTime();
        }

        private void MyCpu_DateTimeRead(object sender, CpuEventArgs e)
        {
            DateTime dt;
            dt = e.DateTime;
            this.Text = dt.ToString();
            //throw new NotImplementedException();
        }

        private void CmdWriteVal_Click(object sender, EventArgs e)
        {
            myVariable.Value = 0;
            myVariable.ValueWritten += MyVariable_ValueWritten;
        }

        private void MyVariable_ValueWritten(object sender, PviEventArgs e)
        {
            //throw new NotImplementedException();
        }

        private void CmdSetStruct_Click(object sender, EventArgs e)
        {
            myStructPV.WriteValueAutomatic = false;
            myStructPV.Value["Member1"] = 10;
            myStructPV.Value["Member2"] = 20;
            myStructPV.Value["Member3"] = myVariable.Value;
            myStructPV.WriteValue();
        }
    }
}

1 Ответ

0 голосов
/ 19 июня 2019

myStructPV - ноль, потому что вы звоните CmdSetStruct_Click(), не создав myStructPV. Вам нужно было бы MyVariable_ValueChanged() запустить сначала или хотя бы поместить из него код, который создает myStructPV в CmdSetStruct_Click().

Пока вы получаете статус «Task pvitest Connected» при запуске init init, все PVI-соединение работает (если у вас нет задачи на вашем ПЛК с именем pvitest, но вы все равно делаете это для CPU Connected тогда ты все в порядке все еще). Вам просто нужно отладить соединение с реальными тегами.

Что касается связи с существующей программой Windows, написанной производителем, это маловероятно. Вам придется использовать какой-то отладчик, чтобы получить доступ к его памяти, или надеяться, что они создали какой-то API, что очень маловероятно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...