я использую метод для извлечения данных с сервера OPC DA с использованием пакетов TitaniumAS, проблема в том, что у меня есть много тегов для чтения/записи, поэтому я должен использовать методы. Метод WriteX работает отлично, так как ему не нужно ничего возвращать, но чтение не возвращает, ну, он выполняет свою работу, он читает, но я не могу использовать эти данные вне метода, потому что это был пустой метод, когда я пытался использовать его как метод String (это тип данных, который мне нужен), он говорит:
Ошибка CS0161 «ReadX (строка, строка)»: не все пути кода возвращают значение
PS: обратите внимание, что я только новичок в C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TitaniumAS.Opc.Client.Common;
using TitaniumAS.Opc.Client.Da;
using TitaniumAS.Opc.Client.Da.Browsing;
using System.Threading;
using System.Threading.Channels;
using Async;
namespace OPCDA
{
class Program
{
static void Main(string[] args)
{
TitaniumAS.Opc.Client.Bootstrap.Initialize();
Uri url = UrlBuilder.Build("Kepware.KEPServerEX.V6");
using (var server = new OpcDaServer(url))
{
server.Connect();
OpcDaGroup group = server.AddGroup("MyGroup");
group.IsActive = true;
Ascon ascon1 = new Ascon();
ReadX("Channel1.Ascon1.AsconS", ascon1.ALM);
Console.WriteLine("value = {0}", ascon1.ALM);
void WriteX(String Link, String Ascon)
{
var definition1 = new OpcDaItemDefinition
{
ItemId = Link,
IsActive = true
};
OpcDaItemDefinition[] definitions = { definition1 };
OpcDaItemResult[] results = group.AddItems(definitions);
OpcDaItem tag = group.Items.FirstOrDefault(i => i.ItemId == Link);
OpcDaItem[] items = { tag };
object[] Values = { Ascon };
HRESULT[] Results = group.Write(items, Values);
}
string ReadX(String Link, String read)
{
var definition1 = new OpcDaItemDefinition
{
ItemId = Link,
IsActive = true
};
OpcDaItemDefinition[] definitions = { definition1 };
OpcDaItemResult[] results = group.AddItems(definitions);
OpcDaItemValue[] values = group.Read(group.Items, OpcDaDataSource.Device);
read = Convert.ToString(values[0].Value);
}
}
}
}
}
Я только что попробовал, ошибка исчезла, но я все еще не могу прочитать ее вне метода, я хочу передать это return read в ascon.ALM
@Seyl Передача значения методу, например строки, не сохранит ссылку на исходное свойство (ascon1.ALM). Вам следует просмотреть руководства по возвращаемым значениям и тому, как ссылки работают в C#.
@Silvermind, я сделал возврат, как вы сказали, и теперь все работает, спасибо
я собираюсь отредактировать сообщение, чтобы показать, как это работает
@Seyl Пожалуйста, не обновляйте свой вопрос решением. Подумайте о том, чтобы переписать свой вопрос так, чтобы вы по крайней мере показали некоторое базовое понимание. Затем добавьте ответ на свой вопрос и примите это.
выполните несколько шагов: 1- напишите свой метод вне Main. 2- удалить параметр string read из метода ReadX. 3- заменить read = Convert.ToString(values[0].Value); на return Convert.ToString(values[0].Value);. 4- используйте ReadX метод, подобный этому ascon1.ALM=ReadX("Channel1.Ascon1.AsconS"); в методе Main.
@Seyl Вы, кажется, разместили два вопроса, они похожи? Вы решили это, потому что в этом вопросе, похоже, не хватает информации, если вы публикуете его повторно, пожалуйста, удалите предыдущий вопрос.





первым шагом было указать возврат следующим образом:
return Convert.ToString(values[0].Value) вместо read = Convert.ToString(values[0].Value)
затем поднимитесь и используйте это значение с моей переменной:
ascon1.ALM=ReadX("Channel1.Ascon1.AsconS");
ReadXне имеет оператора возврата. Может ты хотелreturn read;? Возможно, легче читать, когда вы создаете методы на уровне класса, а не внутри метода Main.