Страница 6 из 8 ПерваяПервая ... 45678 ПоследняяПоследняя
Показано с 51 по 60 из 74

Тема: MasterOPC и чтение файла с ПЛК

  1. #51

    По умолчанию

    Добрый день! В продолжение темы. Есть архив с данными:
    архив.csv.txt

    Обрабатываю его скриптом:
    Код:
    using System;
    using InSAT.OPC;
    using MasterSCADA.Script.FB;
    using MasterSCADA.Hlp;
    using FB;
    using System.Linq;
    using MasterSCADALib;
    using System.Collections.Generic;
    using MasterSCADA.Common.Events;
    using MasterSCADA.Hlp.Pins;
    using MasterSCADA.Hlp.Events;
    using MasterSCADA.Hlp.Archive;
    using MasterSCADA.Archive.Events;
    
    public partial class ФБ : ScriptBase
    {
    	DateTime startArchT = new DateTime(); // переменная начала считывания архива
    	//string name="Событие";
    
    
    	public override void Execute() //алгоритм выполнения записывается в теле процедуры Execute()
    	{
    		//Получаем архивные данные
    		string events=HostFB.TreeItemHlp.FullName+".Входы."+"Вход";	//путь до входа скрипта
    		var elem = (ITreePinHlp)HostFB.TreeItemHlp.Project.Item(events);
    		PinDataArchiveHlp k=elem.DataArchiveItem;	//переменная из архива
    		
    		//if (startArchT==null) //если время не определено, начинаем считывание сначала архива
    		//{
    		//startArchT=k.FirstItemTime;
    		//}
    		var startArch=k.FirstItemTime; //начало считывания архива
    		var endArch=k.LastItemTime; //конец считывания архива
    		var eventsArr=k.Read(startArch, endArch, true); //записываем считанные данные из архива в массив
    		//startArchT=k.LastItemTime; //присваиваем время начала архива по последней считанной записи
    		Параметр1=eventsArr.Count();
    		
    		//Int16?	eventsVal=null;	//код аварии
    		//НомерСобытия=Convert.ToInt16(eventsArr[Convert.ToByte(eventsArr.Count())].Value); //получаем код аварии
    		//ВремяСобытия=Convert.ToString(eventsArr[Convert.ToByte(eventsArr.Count())].Time.ToLocalTime());
    		for (int i=0;i<eventsArr.Count();i++)
    		{
    			DateTime? TStart=null;	//время начала
    			Int16?	eventsVal=null;	//код аварии
    
    			eventsVal=Convert.ToInt16(eventsArr[i].Value); //получаем код аварии
    			//Параметр1=Convert.ToInt16(eventsArr[i].Value);
    			НомерСобытия=eventsVal;
    			ВремяСобытия=Convert.ToString(eventsArr[i].Time.ToLocalTime());			
    		}
    		
    	}
    
    }
    код скрипта.txt

    На выходе получаю некорректный массив:
    массив_после обработки.csv.txt

    Не могу понять в чём дело. Перепробовал массу вариантов обработки, опросов (периодический/по изменению/входов-выходов), но корректный массив с данными не могу получить. Что-то не так в коде скрипта?
    Последний раз редактировалось energvk; 16.05.2017 в 15:14.

  2. #52

    По умолчанию

    Смотрите под отладчиком:
    http://blog.insat.ru/2016/10/script-csharp8.html
    Навскидку:
    Параметр1=eventsArr.Count();
    Надо:
    Параметр1=eventsArr.Length;
    Спасибо.

  3. #53

    По умолчанию

    Параметр1=eventsArr.Length;
    Такой вариант я тоже пробовал, разницы никакой. Значения eventsArr.Count() и eventsArr.Length были равны при этом.

    Смотрите под отладчиком:
    http://blog.insat.ru/2016/10/script-csharp8.html
    Н-да, очень не хотелось ставить такой громоздкий Visual Studio из-за такой мелкой задачи, код казалось бы малюсенький. Но видимо без этого никак. Похоже оставлю задачку на потом

    Даже элементарно:
    Код:
    string events=HostFB.TreeItemHlp.FullName+".Входы."+"Вход";	//путь до входа скрипта
    		var elem = (ITreePinHlp)HostFB.TreeItemHlp.Project.Item(events);
    		PinDataArchiveHlp k=elem.DataArchiveItem;	//переменная из архива
    		
    		var startArch=k.FirstItemTime; //начало считывания архива
    		var endArch=k.LastItemTime; //конец считывания архива
    		var eventsArr=k.Read(startArch, endArch, true); //записываем считанные данные из архива в массив
    		//startArchT=k.LastItemTime; //присваиваем время начала архива по последней считанной записи
    		MassiveLength=eventsArr.Length;
    		MassiveCounts=eventsArr.Count();
    на входящие 58 значений eventsArr.Length=eventsArr.Count()=55 меня ставят в ступор
    Последний раз редактировалось energvk; 16.05.2017 в 23:25.

  4. #54

    По умолчанию

    В общем поставил VisualStudio, включил отладку, но мне это не помогло. Не знаю, что в данном случае контролировать в VS. Последний вариант кода такой:
    Код:
    using System;
    using MasterSCADA.Script.FB;
    using MasterSCADA.Hlp;
    using MasterSCADA.Hlp.Archive;
    using FB;
    using System.Linq;
    using MasterSCADA.Hlp.Pins;
    
    public partial class ФБ : ScriptBase
    {
    
    public override void Start()
     {
      System.Diagnostics.Debug.Assert(false); 
     }
    	
    	public override void Execute() //алгоритм выполнения записывается в теле процедуры Execute()
    	{
    		//Получаем архивные данные
    		var elem = HostFB.InputGroup.GetPin("Вход").TreePinHlp;
    		var k=elem.DataArchiveItem;
    		
    		DateTime startArch=k.FirstItemTime.ToUniversalTime();
    		DateTime endArch=k.LastItemTime.ToUniversalTime(); //конец считывания архива
    		
    		var eventsArr=k.Read(startArch, endArch, false); //записываем считанные данные из архива в массив
    		
    		Параметр1=eventsArr.Length;
    		
    		foreach (var element in eventsArr)
        	{   
    			НомерСобытия=Convert.ToInt16(element.Value);
    	    	ВремяСобытия=Convert.ToString(element.Time.ToLocalTime());    		
    	    }		
    	}
    }
    Разницы в результате никакой. В архиве 68 событий, после запуска в массиве получаю 66, после останова/последующего запуска 68. Но при этом первых двух значений нет, и последующие не всегда совпадают с архивными.

  5. #55

    По умолчанию

    Попробуйте из startArch вычесть секунду, а к endArch прибавить.
    Спасибо.

  6. #56

    По умолчанию

    К сожалению не помогло. Получил 67 элементов (при исходных 68)

    При var eventsArr=k.Read(startArch, endArch, true);
    Исходный архив:
    arch.csv.txt

    Полученный массив:
    mass.csv.txt

    При var eventsArr=k.Read(startArch, endArch, false);
    массив также не соответствует архиву, но значения немного другие

  7. #57

    По умолчанию

    Приложите проект целиком (вместе с данными - заархивируйте папку проекта и выложите).
    Спасибо.

  8. #58

    По умолчанию

    Прикладываю тестовый проект

    test_journal.zip

  9. #59

    По умолчанию

    У нас все корректно. Скрипт проверялся в режиме разработки через DoAction.
    Проект с исправленным скриптом и файл сравнения значения в приложении
    Вложения Вложения
    Спасибо.

  10. #60

    По умолчанию

    Спасибо, протестировал. Что осталось непонятным. В таком варианте строка формируется правильно. Только при первом запуске и накоплении архива получаю всё равно -1 запись, первая обрабатывается только при повторном запуске симуляции. Но при том, что
    Код:
    str=str+ Convert.ToString(eventsArr[i].Time.ToLocalTime())+" - "+eventsArr[i].Value.ToString()+"\n";
    формирует строку данных правильно, но
    Код:
    eventsVal=Convert.ToInt16(eventsArr[i].Value); //получаем код аварии
    даёт на выход некорректные данные (смотрю во вкладке данные), про что я и писал ранее. Никак не могу разобраться почему так

Страница 6 из 8 ПерваяПервая ... 45678 ПоследняяПоследняя

Похожие темы

  1. Ответов: 16
    Последнее сообщение: 22.01.2019, 09:43
  2. Сохранение/чтение текстового файла
    от Boris_K в разделе Master SCADA 3
    Ответов: 7
    Последнее сообщение: 18.02.2015, 11:30
  3. ПЛК 154. На ПЛК нет файла конфигурации DEFAULT.PRG
    от Юрий Поляков в разделе ПЛК1хх
    Ответов: 12
    Последнее сообщение: 04.04.2012, 23:04
  4. Чтение файла посредством plcIO
    от Назаров Александр в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 26.10.2008, 13:21
  5. !!!чтение данных из файла на компе
    от max в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 20.10.2008, 12:10

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •